home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / os2 / lxopt120.zip / LXOPTD.INF (.txt) < prev    next >
OS/2 Help File  |  1996-07-01  |  128KB  |  3,913 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. Copyright and License Agreements  ΓòÉΓòÉΓòÉ
  3.  
  4.                         Copyright and License Agreements
  5.  
  6.  
  7. ΓòÉΓòÉΓòÉ 1.1. Copyright Notices  ΓòÉΓòÉΓòÉ
  8.  
  9.  Copyright Notices
  10.  
  11. LXOPT and the LXOPT logo are trademarks of Functional Software Limited. 
  12.  
  13. OS/2, C Set ++ and VisualAge C++ are trademarks of International Business 
  14. Machines Corporation. 
  15.  
  16. The LXOPT Demonstrator software and accompanying documentation are Copyright 
  17. (C) 1994-1996 Functional Software Limited. All rights reserved. 
  18.  
  19.  
  20. ΓòÉΓòÉΓòÉ 1.2. LXOPT Demonstrator License Agreement  ΓòÉΓòÉΓòÉ
  21.  
  22.  LXOPT Demonstrator License Agreement
  23.  
  24. Definition of terms used in this agreement 
  25. LXOPTDEMO: The LXOPT Demonstrator software, utility programs and accompanying 
  26. documentation. 
  27. USER: You, the user of the LXOPT Demonstrator software. 
  28. FSL: Us, Functional Software Limited. 
  29. OUTPUT: Executable computer code, or derivative thereof, created or altered by 
  30. the LXOPT Demonstrator software. 
  31.  
  32. Acceptance 
  33. Use of LXOPTDEMO indicates acceptance by USER of the terms and conditions of 
  34. this agreement. 
  35.  
  36. If you do not agree to these terms and conditions you may not make use of 
  37. LXOPTDEMO and must destroy any and all installed copies of the software. 
  38.  
  39. Grant of License 
  40. The LXOPT Demonstrator software is copyright of Functional Software Limited. 
  41. FSL retains ownership of LXOPTDEMO.  You are hereby granted a nonexclusive 
  42. license to use LXOPTDEMO subject to the permitted uses and restrictions 
  43. contained in this agreement. 
  44.  
  45. Permitted Uses 
  46. LXOPTDEMO is provided for demonstration and evaluation purposes only. 
  47. LXOPTDEMO may be applied to software owned by USER to create OUTPUT.  Use of 
  48. OUTPUT is subject to restrictions described below. 
  49.  
  50. USER may distribute copies of LXOPTDEMO on the condition that each copy is 
  51. complete and unaltered.  Each copy shall include both software and 
  52. documentation which shall include this agreement and accompanying copyright 
  53. notices. 
  54.  
  55. USER may only charge a nominal handling fee for distribution of LXOPTDEMO. 
  56. When doing so USER is requested to inform FSL to ensure distributed copies are 
  57. kept up to date. 
  58.  
  59. Restrictions 
  60. Use of LXOPTDEMO is restricted to a term of ninety days from the date of first 
  61. use of LXOPTDEMO.  Use of LXOPTDEMO is further restricted to a time and date 
  62. not later than the first day of August 1996. 
  63.  
  64. OUTPUT may only be used by USER to assess the performance of LXOPTDEMO.  In 
  65. particular OUTPUT, or any derivation thereof, may not be used for commercial 
  66. gain or for any purpose where malfunction of OUTPUT could result in financial 
  67. loss, injury or loss of life. 
  68.  
  69. Use of OUTPUT is restricted to a term of seven days from the date of creation 
  70. by LXOPT. 
  71.  
  72. OUTPUT may not be used by, or distributed to, any person not bound by the terms 
  73. of this agreement. 
  74.  
  75. USER may not sell or sub-license LXOPTDEMO or any part thereof other than as 
  76. described in Permitted Uses above. 
  77.  
  78. USER may not alter LXOPTDEMO. Such prohibited alterations include, but are not 
  79. limited to, the operation and appearance of the software and the text of the 
  80. documentation which shall include this agreement and accompanying copyright 
  81. notices. 
  82.  
  83. USER may not reverse compile, reverse engineer or reverse assemble any part of 
  84. the LXOPTDEMO software.  For the purposes of this agreement use of the 
  85. LXOPTDEMO software as described in the accompanying documentation shall not 
  86. constitute reverse engineering of the software. 
  87.  
  88. All rights not expressly granted by this agreement are retained by FSL. 
  89.  
  90. Limited Warranty 
  91. LXOPTDEMO does not work with all valid OS/2 executables.  Programming 
  92. constructs exist that defeat the mechanisms used within LXOPTDEMO.  One of the 
  93. purposes for the existence of LXOPTDEMO is for USER to assess the suitability 
  94. of LXOPTDEMO and associated products for use with USER's application(s).  In 
  95. view of this USER assumes all liability and responsibility for the decision to 
  96. use LXOPTDEMO and all OUTPUT produced together with any consequences thereof. 
  97.  
  98. LXOPTDEMO is supplied "AS IS", without warranty of any kind, either expressed 
  99. or implied, statutory or otherwise, including but not limited to the implied 
  100. warranties of merchantability or fitness for a particular purpose that may be 
  101. made by FSL or its software suppliers on this product.  No oral or written 
  102. information or advice given by FSL, its software suppliers, dealers, 
  103. distributors, agents or employees shall create a warranty and you cannot rely 
  104. on the correctness of any such information or advice. 
  105.  
  106. Neither FSL, its software suppliers, dealers, distributors, agents or employees 
  107. shall be liable for any direct, indirect, consequential or incidental damages. 
  108. Including but not limited to damages for loss of business profits, business 
  109. interruption or loss of business information, arising out of the use or 
  110. inability to use the software or accompanying documentation, whether or not FSL 
  111. has been advised of the possibility of such damages. 
  112.  
  113. Under no circumstances will FSL liability exceed the purchase price of the 
  114. software. 
  115.  
  116. Governing Law 
  117. This license is governed by the laws of England and USER agrees to submit to 
  118. the jurisdiction of the English courts. 
  119.  
  120. Where the local laws of USER prohibit the jurisdiction of English law, this 
  121. license will be governed by the laws of the country in which LXOPTDEMO is used. 
  122.  
  123. FSL may, at its own discretion, elect to enforce, apply and interpret the terms 
  124. of this agreement under any applicable foreign jurisdiction. 
  125.  
  126. If any provision of this agreement is unenforceable, all others shall remain in 
  127. effect. Furthermore, any such unenforceable provision shall remain and be 
  128. interpreted in its strictest sense which remains consistent with governing law. 
  129.  
  130.  
  131. ΓòÉΓòÉΓòÉ 1.3. LXOPT Standard License Agreement  ΓòÉΓòÉΓòÉ
  132.  
  133.  LXOPT Standard License Agreement
  134.  
  135. The following is the license agreement for the standard LXOPT software. This is 
  136. the license which shall apply to the purchased product. This license does not 
  137. apply to the LXOPT Demonstrator software which accompanies this document. 
  138.  
  139. Definition of terms used in this agreement 
  140. LXOPT: The LXOPT software, utility programs and accompanying documentation. 
  141. USER: You, the purchaser of the LXOPT software. 
  142. FSL: Us, Functional Software Limited. 
  143. OUTPUT: Executable computer code, or derivative thereof, created or altered by 
  144. the LXOPT software. 
  145.  
  146. Acceptance 
  147. Purchase or use of LXOPT indicates acceptance by USER of the terms and 
  148. conditions of this agreement. 
  149.  
  150. If you do not agree to these terms and conditions you may not make use of LXOPT 
  151. and must destroy any and all installed copies of the software.. 
  152.  
  153. Grant of License 
  154. The LXOPT software is copyright of Functional Software Limited.  FSL retains 
  155. ownership of LXOPT.  You are hereby granted a nonexclusive license to use LXOPT 
  156. subject to the permitted uses and restrictions contained in this agreement. 
  157.  
  158. Permitted Uses 
  159. LXOPT may be applied by USER to software owned by USER. 
  160.  
  161. LXOPT may be applied by USER to software licensed by USER where such actions 
  162. are consistent with that license. 
  163.  
  164. USER may distribute unlimited copies of OUTPUT. 
  165.  
  166. USER may distribute unlimited copies of the files PRELOAD.EXE and PRELOAD.INF. 
  167.  
  168. Restrictions 
  169. USER may not rent, sub-license or allow the prohibited use of LXOPT or any part 
  170. thereof. 
  171.  
  172. Where more than one person might use LXOPT USER must purchase an Additional 
  173. User license for each additional potential user. 
  174.  
  175. USER may not alter LXOPT unless such alteration is approved by FSL. Such 
  176. prohibited alterations include, but are not limited to, the operation and 
  177. appearance of the software and the text of the documentation which shall 
  178. include this agreement and accompanying copyright notices. 
  179.  
  180. USER may not reverse compile, reverse engineer or reverse assemble any part of 
  181. the LXOPT software.  For the purposes of this agreement use of LXOPT as 
  182. described in the accompanying documentation shall not constitute reverse 
  183. engineering of the software. 
  184.  
  185. All rights not expressly granted by this agreement are retained by FSL. 
  186.  
  187. Limited Warranty 
  188. FSL will replace free of charge any defective diskettes on which LXOPT is 
  189. supplied if notified by USER within 60 days of purchase. 
  190.  
  191. LXOPT does not work with all valid OS/2 executables.  Programming constructs 
  192. exist that defeat the mechanisms used within LXOPT.  It is the responsibility 
  193. of USER to test the suitability of LXOPT for USER's applications.  In view of 
  194. this USER assumes all liability and responsibility for the decision to use 
  195. LXOPT and all OUTPUT produced including any consequences thereof. 
  196.  
  197. LXOPT is supplied "AS IS", without warranty of any kind, either expressed or 
  198. implied, statutory or otherwise, including but not limited to the implied 
  199. warranties of merchantability or fitness for a particular purpose that may be 
  200. made by FSL or its software suppliers on this product.  No oral or written 
  201. information or advice given by FSL, its software suppliers, dealers, 
  202. distributors, agents or employees shall create a warranty and you cannot rely 
  203. on the correctness of any such information or advice. 
  204.  
  205. Neither FSL, its software suppliers, dealers, distributors, agents or employees 
  206. shall be liable for any direct, indirect, consequential or incidental damages. 
  207. Including but not limited to damages for loss of business profits, business 
  208. interruption or loss of business information, arising out of the use or 
  209. inability to use the software or accompanying documentation, whether or not FSL 
  210. has been advised of the possibility of such damages. 
  211.  
  212. Under no circumstances will FSL liability exceed the purchase price of the 
  213. software. 
  214.  
  215. Governing Law 
  216. This license is governed by the laws of England and USER agrees to submit to 
  217. the jurisdiction of the English courts. 
  218.  
  219. Where the local laws of USER prohibit the jurisdiction of English law this 
  220. license will be governed by the laws of the country in which LXOPT is used. 
  221.  
  222. FSL may, at its own discretion, elect to enforce, apply and interpret the terms 
  223. of this agreement under any applicable foreign jurisdiction. 
  224.  
  225. If any provision of this agreement is unenforceable, all others shall remain in 
  226. effect. Furthermore, any such unenforceable provision shall remain and be 
  227. interpreted in its strictest sense which remains consistent with governing law. 
  228.  
  229.  
  230. ΓòÉΓòÉΓòÉ 2. *** URGENT MESSAGE ***  ΓòÉΓòÉΓòÉ
  231.  
  232.  *** URGENT MESSAGE ***
  233.  
  234. There is an obscure software fault in the virtual memory manager of OS/2 WARP 
  235. (PJ18014) where FixPak 11 or later has not been applied.  This fault results in 
  236. the unpredictable corruption of a page of memory when an application allocates 
  237. memory in excess of the computers physical RAM and accesses/alters it in a 
  238. particular order forcing swapfile growth. 
  239.  
  240. This problem only affects OS/2 Warp 3.0 to which FixPak 11 or later has not 
  241. been applied. Users of OS/2 V2.x or Warp 3.0 users who have applied FixPak 11 
  242. or later may ignore this message. 
  243.  
  244. Normal applications have little need to concern themselves with this problem. 
  245. Unfortunately LXOPT reliably reproduces the conditions for failure when 
  246. processing a large executable file.  For these purposes a file of 1Mb is 
  247. considered large, although the precise limit is unknown and will vary with 
  248. available RAM. 
  249.  
  250. The most common manifestation of the fault is the failure of an internal 
  251. consistency check resulting in an LXO0116 internal error.  Given the nature of 
  252. the fault errors can appear at any stage and some users have experienced the 
  253. generation of corrupt executable files where a page containing application code 
  254. has been corrupted before being written to disk.  Other users have experienced 
  255. protection violations or unexplained premature termination of the software. 
  256.  
  257. While all software faults are of concern, the unpredictability and potentially 
  258. undetectable nature of this fault make it particularly dangerous. 
  259.  
  260. A workaround involving the removal of the need for swapfile growth has fixed 
  261. all known manifestations of this problem.  This is achieved by pre-setting the 
  262. initial size of the swapfile in config.sys to a value that ensures that 
  263. execution of LXOPT will not require swapfile growth. 
  264.  
  265. To calculate the required figure multiply the size of the largest EXE/DLL to be 
  266. processed by 15 and add it to the 'normal' swapfile size as given by a 
  267. directory listing on your machine.  Obviously running other applications 
  268. simultaneously with LXOPT will affect swapfile requirements and the initial 
  269. swapfile size should be set accordingly.  Adding an additional 5 or 10Mb to the 
  270. resulting figure would be a wise precaution. 
  271.  
  272. The line below sets the initial swapfile size to 50Mb with a 2Mb minimum free 
  273. disk space limit. 
  274.  
  275.    SWAPPATH=D:\ 2048 51200
  276.  
  277. Regardless of file size, if you experience symptoms matching the description 
  278. above you should attempt this workaround. 
  279.  
  280. This advice replaces that in V1.0 which encouraged the use of the COMMIT 
  281. parameter in the MEMMAN statement.  Although beneficial, use of COMMIT is not 
  282. 100 % effective in removing this problem. 
  283.  
  284.  
  285. ΓòÉΓòÉΓòÉ 3. V1.2 - What's Changed?  ΓòÉΓòÉΓòÉ
  286.  
  287.  V1.2 - What's Changed?
  288.  
  289. If you were a registered V1.0 or V1.1 user, V1.2 should have been shipped to 
  290. you and all additional user licenses upgraded free of charge.  This applies to 
  291. all registered users regardless of date of purchase.  If you are a registered 
  292. V1.0 user and did not receive your update please let us know via technical 
  293. support. 
  294.  
  295. Version 1.2 
  296.  
  297.      Code Preloader 
  298.      The new /preload option allows application code to be transferred to the 
  299.      swapfile at boot time.  A freely distributable preload utility works in 
  300.      combination with LXOPT processed code allowing users to selectively 
  301.      preload code.  Executed code is loaded direct from the swapfile with no 
  302.      need to apply fixups or for network traffic.  Preloads of network files 
  303.      may be automatically deferred until specific network drive(s) are 
  304.      available allowing preload requests (e.g. in startup.cmd) to be made prior 
  305.      to restoration of network connections. 
  306.  
  307.      Dead Code Elimination 
  308.      Code recognition algorithms have been revised to improve the detection and 
  309.      elimination of unused code/data in the processed code object.  Code 
  310.      previously included due to a cyclic reference or unused pointer reference 
  311.      (typically from unused CASE statement jump tables) is now removed. 
  312.  
  313.      Recording Efficiency 
  314.      Code path detection will now predict more code paths removing the need to 
  315.      record their use in the recording file.  Untraced sequences will execute 
  316.      faster and help reduce recording file sizes. 
  317.  
  318.      Fixup Encodings 
  319.      Generation of new fixup tables has been improved to allow the grouping of 
  320.      fixups with common targets.  Although previous versions of LXOPT performed 
  321.      this optimisation, some combinations were omitted.  This is particularly 
  322.      important for DLLs which typically contain a far larger quantity of fixups 
  323.      in relation to code size. 
  324.  
  325.      Undo Utility 
  326.      LXOPT now includes an undo utility.  Applied to processed DLL/EXE files 
  327.      this will restore the original unprocessed version of a file and delete 
  328.      any related files generated by LXOPT.  This utility is installed in the 
  329.      WPS as part of the installation process.  See UNLXOPT for more details. 
  330.  
  331.      DosGetMessage 
  332.      Code inserted from IBM libraries to handle DosGetMessage API calls 
  333.      violates an LXOPT restriction.  LXOPT now rejects such code which needs to 
  334.      be moved to another code object to operate correctly.  See the LXO0169 
  335.      error description for more details. 
  336.  
  337.      Default Recording File 
  338.      The default recording file pathname is now based on the absolute path name 
  339.      of the processed executable.  This forces recording files into the same 
  340.      directory as the executable by default.  Relative path names may still be 
  341.      specified using the /recFile option. 
  342.  
  343.      Software Faults 
  344.      Small EXE/DLL files produced by the Borland linker sometimes use 16 bit 
  345.      values to indicate entry points into 32 bit code.  This is a valid 
  346.      technique which is now correctly handled by LXOPT. 
  347.  
  348.      Some assembler routines in the Watcom floating point library contain 
  349.      operations which violate LXOPT restrictions.  V1.2 will now handle the 
  350.      violations which have been reported.  If you experience floating point 
  351.      related problems during recording sessions please notify technical 
  352.      support. 
  353.  
  354.      Assembler sequences inserted into code to help trace execution have been 
  355.      altered to avoid a potential memory update race condition with a store 
  356.      from an outstanding floating point instruction. 
  357.  
  358.      The method by which access to recording code is serialised has been 
  359.      updated.  This improves performance and prevents the deadlock that often 
  360.      occurred during recording sessions where multiple threads of varying 
  361.      priorities were executed. 
  362.  
  363.    Previous Changes
  364.  
  365.  Version 1.1 
  366.      Pricing 
  367.      The price of the single user license increased slightly and all 
  368.      distribution license fees were removed. 
  369.  
  370.      Processing Large EXE/DLL Files Under WARP 
  371.      Advice on how to avoid problems that may occur processing large EXE/DLL 
  372.      files under WARP has been revised.  It is important that LXOPT users are 
  373.      aware and act on this information.  See Urgent Message for details. 
  374.  
  375.      WARP Compressed Page Support 
  376.      LXOPT now supports the EXE/DLL file page compression introduced with OS/2 
  377.      WARP.  See the /pack2 option for more details. 
  378.  
  379.      New Arrangement Algorithms 
  380.      LXOPT has two new arrangement algorithms.  The binary algorithm arranges 
  381.      code based on the similarity of binary patterns of use and is the new 
  382.      default algorithm.  Parkonly, as the name suggests, parks unused code but 
  383.      performs no other arrangement.  It is intended for use where developers 
  384.      wish to retain control over the arrangement of executed code. 
  385.  
  386.      CPU Optimisations 
  387.      V1.1 contains the first LXOPT CPU oriented optimisations.  These focus on 
  388.      CPU instruction cache utilisation efficiency (see CPU Instruction Caching) 
  389.      and branch prediction.  New options giving greater control over alignment 
  390.      within the processed code object have also been provided.  See /alignCode, 
  391.      /alignData, /cLineSize and /cLineWaste for more details.  CPU bound 
  392.      applications should achieve performance improvements of between one and 
  393.      five per cent.  There are numerous other optimisation opportunities which 
  394.      will be included in future versions of LXOPT. 
  395.  
  396.      Special code arrangement pre and post processing have also been introduced 
  397.      to strike a better balance between CPU efficiency and working set tuning. 
  398.      This suppresses layout divisions within performance critical areas and 
  399.      significantly reduces the size of recording files. 
  400.  
  401.      Default Alignment 
  402.      The default alignment of code pointer targets is changed from 4 to 1. 
  403.      Performance related code alignment issues should be addressed using the 
  404.      new /cLineSize and /cLineWaste options.  Applications which rely on 
  405.      alignment to make the low order bits of addresses redundant should set 
  406.      alignment explicitly using the /align option. 
  407.  
  408.      ICC.EXE Patch for CSet++ V2.0 and 2.1 Users 
  409.      Linking initiated by ICC.EXE always forced a base address for EXE files 
  410.      resulting in the removal of internal fixups.  LXOPT requires internal 
  411.      fixups for correct processing of the input executable.  Although many 
  412.      users could avoid this problem by direct use of LINK386, C++ template 
  413.      users were forced to link directly via ICC preventing the use of LXOPT.  A 
  414.      patch for ICC.EXE is now included to remove this restriction.  See Patch 
  415.      for CSet++ V2.0 and 2.1 Users for a description of this patch and how to 
  416.      apply it. 
  417.  
  418.      Demo Version Restrictions 
  419.      Code arranged by the demonstration version will not produce a tone on 
  420.      start-up unless an error is encountered.  The tone has been replaced by a 
  421.      processed application lifetime limit of seven days.  A warning is also 
  422.      produced if the machine in use has not been recently rebooted to encourage 
  423.      testing in line with the new Performance Testing section. 
  424.  
  425.      This change also allows evaluators to time the execution of processed code 
  426.      without having to deduct the duration of the start-up and termination 
  427.      tones.  Code produced by the LXOPT Demo will now execute almost 
  428.      identically to that produced by the full product but may produce up to 
  429.      three additional page faults during the runtime of the processed 
  430.      application. 
  431.  
  432.      Recording Session Error Messages 
  433.      V1.0 of LXOPT placed error messages produced during recording sessions in 
  434.      the file "LXREC.ERR".  V1.1 retains this behaviour but when the message 
  435.      has been safely recorded it will now attempt to display the message on 
  436.      screen. 
  437.  
  438.      Code Offset Translations 
  439.      New options to translate code offsets between pre and post arrangement 
  440.      code are now provided.  These are designed to assist in debugging 
  441.      situations and to help trace instruction pointer based error messages back 
  442.      to the original source code.  See the /getOld and /getNew options for more 
  443.      details. 
  444.  
  445.      Code Disassembly 
  446.      Code within the processed code object can now be disassembled using the 
  447.      /disasm option. 
  448.  
  449.      Utility Programs 
  450.      New utility programs have been introduced to time application execution, 
  451.      simulate low memory conditions and translate EXE/DLL files between the 
  452.      OS/2 2.x and WARP compressed executable file formats.  See TimeRun, 
  453.      Thrash, LXWarp and LXUnWarp for more details. 
  454.  
  455.      Installation/WPS Set-up 
  456.      The installer now creates an LXOPT desktop folder.  The contained program 
  457.      objects are prepared to allow use of LXOPT and associated utilities direct 
  458.      from the WPS.  Alteration of DPATH is not required for the use of LXOPT 
  459.      V1.1. 
  460.  
  461.      Software Faults 
  462.      The LXOPT recorder has been redesigned to remove the problems some users 
  463.      experienced while attempting to perform multiple simultaneous recording 
  464.      sessions.  Unique recording DLLs are now created on a per application 
  465.      basis. 
  466.  
  467.      The code analyser has been updated to prevent rejection of code generated 
  468.      by the Watcom C++ compiler. 
  469.  
  470.      Run times on large files (>2Mb) have been reduced by improved efficiency 
  471.      in the file creation routines.  Note that LXOPT is not intended for use on 
  472.      a daily basis but as a final 'pre-shipment' optimiser.  Future design 
  473.      targets will permit arrangement times of up to 12 hours (i.e. over night) 
  474.      if optimisation rewards warrant it. 
  475.  
  476.  
  477. ΓòÉΓòÉΓòÉ 4. *** START HERE! ***  ΓòÉΓòÉΓòÉ
  478.  
  479.  *** START HERE! ***
  480.  
  481. Welcome to the LXOPT Demonstrator! 
  482. LXOPT is a unique tool for the OS/2 developer.  By working set tuning EXE/DLL 
  483. files LXOPT will typically halve the amount of memory required to store 
  484. application code.  The instruction stream is also processed to ensure maximum 
  485. CPU instruction cache efficiency and a /preload option allows the resulting 
  486. code to be transferred to the swapfile at machine start-up.  See the 
  487. Introduction section for a more complete introduction to the software. 
  488.  
  489. Quick Start 
  490. The installer has created program objects to process applications using 
  491. standard LXOPT defaults which appear on the Open menu of EXE and DLL files.  If 
  492. you are eager to get started go straight to Using LXOPT. 
  493.  
  494. Support 
  495. Almost all software may be processed using the default options supplied via the 
  496. Workplace Shell Open menu.  LXOPT is a powerful tool with numerous options to 
  497. handle the variety of special conditions under which some applications execute. 
  498. If you have any special requirements or questions on the use of LXOPT please 
  499. contact technical support. 
  500.  
  501. Spreading the Word 
  502. Working set tuning reduces the memory requirements not just of the processed 
  503. application but the system as a whole.  As more tuned applications become 
  504. available users will experience even greater benefits.  Please help by passing 
  505. on copies of this demonstration version to other OS/2 developers. 
  506.  
  507. Thank you for your interest in the LXOPT Demonstrator. 
  508.  
  509. Functional Software Ltd. 
  510.  
  511.  
  512. ΓòÉΓòÉΓòÉ 5. Introduction  ΓòÉΓòÉΓòÉ
  513.  
  514.                                   Introduction
  515.  
  516.  
  517. ΓòÉΓòÉΓòÉ 5.1. Background  ΓòÉΓòÉΓòÉ
  518.  
  519.  Background
  520.  
  521. With the release of OS/2 V2.0 came the introduction of the Linear Executable 
  522. file format, the format now used by all 32-bit OS/2 EXE and DLL files.  For the 
  523. first time the Linear Executable allowed code to be loaded into memory in 4Kb 
  524. units, the page size of the 80386 and later processors. 
  525.  
  526. This new efficient design changed the way code was loaded into memory. 
  527. Applications were no longer loaded on a per segment basis but used the virtual 
  528. memory mechanisms now used by the rest of the operating system. 
  529.  
  530. A code page is loaded into memory when an attempt is made to execute an 
  531. instruction within the page.  The 4Kb page is read from the disk and 
  532. relocations (otherwise known as 'fixups') applied from data structures 
  533. contained within the Linear Executable.  When memory is heavily utilised code 
  534. pages will be recycled as with other system memory and the code is discarded. 
  535. If instructions on the code page are later referenced the page must be reloaded 
  536. from the disk and fixups reapplied. 
  537.  
  538. An efficient program would ensure that all instructions on a single code page 
  539. were executed at roughly the same time to make sure that memory was used and 
  540. paged most efficiently. Unfortunately modern programming methods and 
  541. convenience favour grouping code logically rather than by time of execution. 
  542. During the run time of a typical application between 30% and 50% of the code 
  543. loaded is never executed.  Entire 4Kb code pages are often loaded to execute 
  544. only twenty or thirty bytes of code. 
  545.  
  546.  
  547. ΓòÉΓòÉΓòÉ 5.2. What is LXOPT?  ΓòÉΓòÉΓòÉ
  548.  
  549.  What is LXOPT?
  550.  
  551. LXOPT (Linear eXecutable OPTimiser) is a development tool designed to improve 
  552. the code layout of 32-bit OS/2 applications.  Applied directly to EXE and DLL 
  553. files LXOPT rearranges code at the assembler level to minimise page faults, 
  554. maximise CPU instruction cache efficiency and provides many other useful 
  555. benefits.  It is particularly effective on large applications forced to run in 
  556. low memory conditions and can reduce code load page faults by up to 95% in 
  557. extreme conditions. 
  558.  
  559. LXOPT can group together all unused assembler sequences and move them to other 
  560. code pages from where they will not occupy memory unless executed.  This 
  561. technique, known as 'Sleeping Code Parking', reduces the total code memory 
  562. requirements of a typical application by between 30% and 50%. 
  563.  
  564. LXOPT is unique in that it works at the assembler level and is able to change 
  565. the location of not just whole procedures but individual processor 
  566. instructions.  Code handling infrequently used branches of IF or CASE 
  567. statements may be moved to different code pages significantly reducing a 
  568. programs working set. 
  569.  
  570. LXOPT also produces minor CPU related performance improvements by improving CPU 
  571. cache efficiency and branch prediction.  CPU bound applications should achieve 
  572. performance improvements of between one and five percent. 
  573.  
  574. Applications to which LXOPT is to be applied must adhere to certain 
  575. restrictions or may require special caution, see restrictions for more 
  576. information. The LXOPT Demonstrator is created and distributed to allow 
  577. potential users to assess the performance of LXOPT with their own applications. 
  578.  
  579. LXOPT operates directly on 32-bit code in OS/2 Linear Executable files and does 
  580. not normally require alteration or recompilation of source code.  Processed 
  581. applications may contain 16-bit code but this code is not optimised by LXOPT. 
  582.  
  583. LXOPT is not designed for daily use but intended as a final stage in the 
  584. development cycle.  A completed application should be processed by LXOPT as a 
  585. final optimisation phase before retesting and internal or external deployment. 
  586.  
  587. This demonstration copy contains all the features of the full version but may 
  588. only be used for evaluation purposes.  Please see the LXOPT Demonstrator 
  589. License Agreement for more details. Applications created by this demonstration 
  590. version are also time limited to seven days of use. 
  591.  
  592. Note:     The normal method of testing a performance enhancing tool is to 
  593.           compare the execution times of pre and post optimised code.  LXOPT 
  594.           primarily operates by improving the caching characteristics of 
  595.           application code and results are distorted by caching effects within 
  596.           the file and operating systems.  See Performance Testing for details 
  597.           of how to negate these effects. 
  598.  
  599.           If you intend using this software on files greater than 1Mb in size 
  600.           and are using OS/2 WARP 3.0 (without FixPak 11 or higher) there is a 
  601.           workaround for a software fault of which you MUST be aware.  See 
  602.           Urgent Message for details. 
  603.  
  604.  
  605. ΓòÉΓòÉΓòÉ 5.3. Benefits of LXOPT  ΓòÉΓòÉΓòÉ
  606.  
  607.  Benefits of LXOPT
  608.  
  609. Working Set Reduction 
  610. The primary benefit of LXOPT is its ability to identify an applications working 
  611. set and produce an optimised code layout based upon it.  Any application with 
  612. code greater than 4Kb in size may benefit from this effect.  The effect is most 
  613. apparent when an application is forced to execute in a restricted amount of 
  614. memory. 
  615.  
  616. Reduction of the working set reduces page faults which improves performance. 
  617. Large applications constrained by physical memory may benefit greatly from this 
  618. effect.  Small applications benefit from improved start up times and contribute 
  619. to a general reduction in system load. 
  620.  
  621. Code Parking 
  622. Users may be familiar with 'Dead Code Elimination', an optimisation used by 
  623. compilers to remove unused code.  LXOPT performs 'Sleeping Code Parking', the 
  624. moving of apparently unused code to the end of an applications code space. 
  625. 'Parked' code will not normally be loaded by your application BUT REMAINS 
  626. ACCESSIBLE should it be required. 
  627.  
  628. Code parking can significantly reduce the total amount of memory used by 
  629. application code, typically by 30% to 50%.  It is particularly useful in 
  630. reducing the memory overhead of largely dormant applications that run 
  631. continuously in the background. 
  632.  
  633. Code Removal 
  634. The LXOPT code analyser will detect and completely remove unreferenced 
  635. instruction sequences.  Although modern linkers are normally very good at 
  636. performing this function they are unable to detect some forms of unused code. 
  637. LXOPT identifies every byte of code, if any instruction is unreachable LXOPT 
  638. will remove it. 
  639.  
  640. Preloading 
  641. LXOPT includes a /preload option which permits application files to be 
  642. transferred to the swapfile on machine start-up.  This technique, formerly 
  643. reserved for OS/2 system DLLs, is now available to all applications. 
  644. Preloading permits faster application start-up and paging at the expense of an 
  645. extended boot time and increase in swapfile requirements. 
  646.  
  647. CPU Optimisations 
  648. Code arrangement and CPU caching related options allow the tuning of code for 
  649. maximum CPU cache efficiency.  Improved instruction caching aids performance 
  650. both by helping to reduce instruction fetch times and freeing the main memory 
  651. bus for other instruction/data accesses.  The execution history generated by 
  652. LXOPT is also used to assist in branch prediction. 
  653.  
  654. Ease of Use 
  655. LXOPT works directly on application EXE and DLL files.  Code usage gathering 
  656. and new layout generation are fully automated, no source code files are ever 
  657. examined or altered. 
  658.  
  659. Developers no longer need to alter code structure, insert compiler pragmas or 
  660. predict runtime code usage to tune their code layouts.  Near optimal code 
  661. layouts which can effectively halve code size can often be achieved with less 
  662. than an hours work. 
  663.  
  664. Users With Insufficient RAM 
  665. Despite declining memory prices many users still operate machines with 
  666. insufficient RAM for their requirements. 
  667.  
  668. For many applications LXOPT provides a means of quickly and effectively 
  669. supporting such users while providing a useful performance enhancement 
  670. regardless of the target machine. 
  671.  
  672. Multitasking 
  673. Users are often limited in running multiple concurrent applications by memory 
  674. constraints.  Multitasking applications compete with each other for valuable 
  675. system memory. 
  676.  
  677. Applications processed by LXOPT work more effectively in low memory conditions, 
  678. reducing system load when running several large programs concurrently. 
  679.  
  680. Fewer/Faster Disk Accesses 
  681. In addition to the reduction in disk activity due to fewer page faults, 
  682. optimised code layouts have other beneficial effects. 
  683.  
  684. Pages in the LXOPT processed application file will tend to be arranged in the 
  685. order in which they are used.  Once a page is loaded from disk following pages 
  686. are likely to be fully or partially loaded at the same time by disk 
  687. hardware/cache.  Subsequent page faults can therefore often avoid a disk hit, 
  688. significantly reducing the time taken to service the fault.  Even if not 
  689. already loaded, subsequent code pages will tend to be located at nearby 
  690. locations on the disk so reducing head movement. 
  691.  
  692. In addition LXOPT aligns each code page within the file to minimise the number 
  693. disk blocks which need to be read by the disk controller. 
  694.  
  695. Using Libraries 
  696. All application developers use libraries.  Some come with the compiler, others 
  697. are developed in house or purchased externally.  Normally these libraries are 
  698. developed for general use without regard for a specific application. 
  699.  
  700. LXOPT can process these libraries to optimise their memory usage with your 
  701. application.  Unused code in the libraries is 'parked' where it causes least 
  702. overhead to your application. This benefit may be gained whether the library is 
  703. statically or dynamically linked. 
  704.  
  705. Error handling/Debugging code 
  706. Most software contains error handling for unexpected internal errors.  Often 
  707. such code is pre-processed out before final release.  While the tests for error 
  708. conditions remain, LXOPT will 'park' the error handling itself. While your 
  709. application is operating normally the overhead of the error handler code is 
  710. reduced to the size of a single transfer instruction. 
  711.  
  712.  
  713. ΓòÉΓòÉΓòÉ 5.4. Restrictions  ΓòÉΓòÉΓòÉ
  714.  
  715.  Restrictions
  716.  
  717. Please ensure that all programmers involved in the development of the software 
  718. to be processed read the contents of this section. 
  719.  
  720. LXOPT may be applied to almost all OS/2 Linear Executable DLL or EXE files 
  721. containing a pageable 32 bit code object.  Some unusual programming techniques 
  722. may cause LXOPT to fail or require special caution.  If your application 
  723. violates one of the restrictions below and you are unable to rectify the 
  724. problem please contact technical support. 
  725.  
  726. A 32 bit OS/2 linear executable application may contain many objects.  An 
  727. object is analogous to a segment within the old 16 bit file format with each 
  728. object typically containing a different type of information.  For example a 
  729. normal 32 bit executable file might contain 32 bit code object(s), data 
  730. object(s), resource object(s) and perhaps a 16 bit code object to interface 
  731. with some 16 bit API's. LXOPT always applies itself to the largest 32 bit code 
  732. object. 
  733.  
  734. To function correctly LXOPT needs to identify all potential execution paths 
  735. through your program. LXOPT will work correctly with all transfers of control 
  736. generated by standard compilers and normal assembler techniques.  Some coding 
  737. techniques which rely on assumptions about code layout will cause LXOPT to fail 
  738. or require special caution.  Run times will also be reduced if users avoid 
  739. placing read-only application data within the processed code object. 
  740.  
  741. These following restrictions apply only when they involve the code object which 
  742. LXOPT processes.  A restriction may often be avoided by moving the offending 
  743. code/data to a different object.  This can be achieved by placing the code in a 
  744. named code segment via compiler options/pragmas and adding this name to the 
  745. module definition (.DEF) file in the SEGMENTS section. 
  746.  
  747. Pointer Alignment 
  748. If your code relies on the alignment of functions/data (i.e. lower bits used 
  749. for informational purposes and masked out before dereference) you must use a 
  750. consistent /align option value. 
  751.  
  752. Hard Coded Relative Distances 
  753. Your application may not make assumptions about relative distances between 
  754. functions or the absolute location thereof.  For example, a statement such as 
  755. ((NextFunc *)((char *)MyProc+10))() will cause your processed application to 
  756. expire just ahead of your programming career. 
  757.  
  758. In general the absolute distance between two locations within the processed 
  759. code object should never be used within a calculation.  The only exception to 
  760. this rule is where both addresses refer to data and no code exists between 
  761. them.  Assembler programmers may need to take particular care in observing this 
  762. restriction. 
  763.  
  764. A special case of this error occurs in code inserted by IBM compiler libraries 
  765. when handling a DosGetMessage call.  See the LXO0169 error for more details. 
  766.  
  767. Timing 
  768. During the recording process LXOPT increases the load on the CPU and generates 
  769. occasional disk activity.  If an application is timing sensitive this may 
  770. affect its operation.  CPU load/disk activity can often be reduced or 
  771. redistributed to reduce such problems.  See Creating a Recording Version for 
  772. more information. 
  773.  
  774. Exporting Code Object Data 
  775. LXOPT assumes all exports from the processed code object are 32 bit function 
  776. entry points.  Do not export data from your applications 32 bit code object as 
  777. this will cause failure of LXOPT or the resulting program. 
  778.  
  779. Self Referencing Code 
  780. Code that deliberately alters itself to effect transfers may fail. If your 
  781. application contains assembler that uses this technique disassemble the 
  782. resulting code to ensure it has been translated correctly.  LXOPT will issue a 
  783. warning if the code object it is processing is writeable. 
  784.  
  785. Invalid SS:ESP 
  786. LXOPT uses the applications stack during recording sessions.  To ensure correct 
  787. operation of the recorder SS:ESP must be valid at all transfers of control 
  788. within your application (e.g. during a JMP instruction).  If your 32 bit code 
  789. receives control with an invalid or 16 bit stack a valid SS:ESP pair must be 
  790. created before the next transfer is executed. 
  791.  
  792. LXOPT also uses the DS register.  All recording operations are suspended while 
  793. the DS register contains a value other than that in effect at application 
  794. start-up. 
  795.  
  796.  
  797. ΓòÉΓòÉΓòÉ 5.5. An Example  ΓòÉΓòÉΓòÉ
  798.  
  799.  An Example
  800.  
  801. The effect of LXOPT on code is best demonstrated by example.  The caption below 
  802. shows a simple piece of disassembled 'C' code which opens a file and checks 
  803. that it contains the correct version number. 
  804.  
  805. /* open the file */
  806. fp = fopen(filePath, "r");
  807.         PUSH "r"
  808.         PUSH filePath
  809.         CALL fopen
  810.         MOV  fp, EAX
  811.  
  812. /* check if opened ok */
  813. if (!fp) {
  814.         CMP EAX, EAX
  815.         JNE DO_FSCANF
  816.    ReportError(RE_OPEN_FAIL, filePath);
  817.         PUSH filePath
  818.         PUSH RE_OPEN_FAIL
  819.         CALL ReportError
  820.    return FALSE;
  821.         MOV EAX, 0
  822.         RET
  823. }
  824.  
  825. /* read in the version number */
  826. fscanf(fp, "VERSION %d", &version);
  827.         PUSH &version
  828.         PUSH "VERSION %d"
  829.         PUSH fp
  830.         CALL fscanf
  831.  
  832. /* test the version number */
  833. if (version != APP_VERSION) {
  834.         CMP version, APP_VERSION
  835.         JE  VERSION_OK
  836.    ReportError(RE_WRONG_VERSION, filePath);
  837.         PUSH filePath
  838.         PUSH RE_WRONG_VERSION
  839.         CALL ReportError
  840.    return FALSE;
  841.         MOV EAX, 0
  842.         RET
  843. }
  844.  
  845. The code performs some simple error checking typical of this type of operation. 
  846. In normal use the error handling code will not be executed yet is always loaded 
  847. due to its proximity to the other code. 
  848.  
  849. LXOPT uses the execution history to identify the error handling as 'Sleeping 
  850. Code' and moves it to another code page.  This produces the new instruction 
  851. sequence below. 
  852.  
  853.         ...
  854.         PUSH "r"
  855.         PUSH filePath
  856.         CALL fopen
  857.         MOV  fp, EAX
  858.  
  859.         CMP EAX, EAX
  860.         JE  NOT_OPENED
  861.  
  862.         PUSH &version
  863.         PUSH "VERSION %d"
  864.         PUSH fp
  865.         CALL fscanf
  866.  
  867.         CMP version, APP_VERSION
  868.         JNE  WRONG_VERSION
  869.         ...
  870.  
  871. The twenty two instructions of the original code sequence is reduced to twelve 
  872. while the application executes normally.  If a file access error does occur the 
  873. error handling is loaded and executed normally. 
  874.  
  875. LXOPT improvements don't stop there.  The entire 'ReportError' function is also 
  876. parked and code from the library functions for 'fopen' and 'fscanf' will be 
  877. separated from the other library code allowing it to be moved to the code page 
  878. on which it is used.  Also 'fscanf' is a powerful function which contains code 
  879. capable of reading many data types and includes floating point conversions. 
  880. LXOPT breaks the function into its component parts and only moves the code from 
  881. 'fscanf' which specifically handles the input formats specified by your 
  882. application. 
  883.  
  884. The result is a code sequence that is effectively halved in size and which only 
  885. needs a single code page to contain all the required code. 
  886.  
  887.  
  888. ΓòÉΓòÉΓòÉ 6. User Guide  ΓòÉΓòÉΓòÉ
  889.  
  890.                                    User Guide
  891.  
  892.  
  893. ΓòÉΓòÉΓòÉ 6.1. Using LXOPT  ΓòÉΓòÉΓòÉ
  894.  
  895.  Using LXOPT
  896.  
  897. Use of LXOPT is divided into four stages. 
  898.  
  899. Preparation 
  900. The EXE/DLL file to be processed may need some special preparation.  What 
  901. preparation is needed (if any) is described in preparing your application. 
  902.  
  903. Creating a Recording Version 
  904. Next a special version of your application must be created.  This will execute 
  905. as normal but will create a recording detailing where and when all code is 
  906. used.  LXOPT creates this special version of your application for you.  See 
  907. Creating a Recording Version for more details. 
  908.  
  909. Running the Special Version 
  910. The special recording version of the application is then executed to generate a 
  911. recording.  This is the most important part of the optimisation process.  See 
  912. Recording Program Statistics for details. 
  913.  
  914. Arrangement 
  915. Finally LXOPT is used again, this time with the /arrange parameter to create an 
  916. optimised code arrangement.  Options may also be specified to compress pages in 
  917. the output file (/pack2) or to allow the created file to be preloaded 
  918. (/preload). 
  919.  
  920. Arrangement issues are discussed in Creating An Optimised Code Arrangement 
  921.  
  922. The result is a leaner, faster application with dramatically improved 
  923. performance characteristics when forced to run in low memory conditions. 
  924.  
  925.  
  926. ΓòÉΓòÉΓòÉ 6.1.1. Preparing Programs  ΓòÉΓòÉΓòÉ
  927.  
  928.  Preparing Programs
  929.  
  930. EXE File Preparation 
  931. LXOPT can process both EXE and DLL files.  To process EXE files they must 
  932. contain internal fixups which are normally removed by the linker when the 
  933. executable is given a base address. 
  934.  
  935. LINK386 users must ensure that EXE files have been linked without the /base 
  936. linker option.  ICC.EXE in CSet++ V2.0 and V2.1 automatically provides 
  937. '/base:65536' as an option to LINK386 when initiating a link.  Users of this 
  938. compiler should invoke LINK386 separately.  This is not possible where the code 
  939. to be processed uses templates and for these users a patch for ICC.EXE is 
  940. included to allow use of LXOPT.  See Patch For Cset++ V2.0 and V2.1 Users for 
  941. more details. 
  942.  
  943. Users of VisualAge C++ should use ILINK with the '/nobase' option.  Do not link 
  944. using ICC.EXE, this provides the /base option to a link even if /nobase is 
  945. specified. 
  946.  
  947. Watcom created EXE files need the 'op int' linker option to ensure internal 
  948. fixups are retained. 
  949.  
  950. DLL File Preparation 
  951. Standard DLL's always retain internal fixups and require no special 
  952. preparation. 
  953.  
  954. DosGetMessage 
  955. Code within the IBM CSet/VAC libraries violates an LXOPT restriction when 
  956. handling a DosGetMessage call.  Even where an application does not make direct 
  957. use of this function it will often be included to handle messages required by 
  958. the compiler library. 
  959.  
  960. LXOPT detects use of this technique and produces an LXO0169 error.  See the 
  961. description of this error for information on how to avoid this problem. 
  962.  
  963. Restrictions and Stack Use 
  964. Before using LXOPT please read the Restrictions section to ensure that it is 
  965. suitable for your application. 
  966.  
  967. LXOPT uses up to 2Kb of your applications stack while recording.  To reduce 
  968. stack size problems LXOPT intercepts thread creation within the recording 
  969. application and increases the allocated stack by 4Kb.  The main application 
  970. stack is not altered. 
  971.  
  972.  
  973. ΓòÉΓòÉΓòÉ 6.1.2. Creating a Recording Version  ΓòÉΓòÉΓòÉ
  974.  
  975.  Creating a Recording Version
  976.  
  977. To create a recording version of your EXE or DLL file it must be processed by 
  978. LXOPT using the /prep parameter. If the /arrange parameter is not specified 
  979. then /prep is assumed by default.  To prepare an application using default 
  980. options select LXOPT Prepare from the Open menu or using the command line type: 
  981.  
  982.    LXOPTD <exe/dll path name>
  983. LXOPT searches the file for 32 bit code objects and selects the largest for 
  984. processing. 
  985.  
  986. Although most applications will be processed in under five minutes, LXOPT is 
  987. effectively reconstructing your entire application including any libraries to 
  988. which it is statically linked.  Processing may take up to a few hours for multi 
  989. Mb application files. 
  990.  
  991. Errors and Warnings 
  992. LXOPT detects all unreferenced bytes in the processed code object.  Often these 
  993. bytes are initialised data or unused code.  For each unused byte sequence which 
  994. contains fixups LXOPT produces a LXO0150 warning.  It is normal for files to 
  995. produce several of these warnings during processing.  All unused bytes are 
  996. removed from the output executable. 
  997.  
  998. When LXOPT detects an error processing a file a simple error message is 
  999. produced.  More detailed information on the error and how to avoid it is 
  1000. provided via the F1 key which provides a direct link to the reference section 
  1001. in this documentation. 
  1002.  
  1003. Memory Use Analysis 
  1004. During processing LXOPT identifies every byte within the processed code object. 
  1005. There are three basic classifications; 'code', 'data' and 'unused'. 
  1006.  
  1007. 'Code' bytes are those used to form processor instructions and will normally be 
  1008. the largest group. 
  1009.  
  1010. 'Data' bytes are read-only data placed within the code object.  Such data is 
  1011. normally inserted by a compiler and are usually compile time constants or jump 
  1012. tables used in the encoding of CASE statements. 
  1013.  
  1014. 'Unused' bytes are never referenced within the application.  Typically these 
  1015. are padding used to adjust procedures and data to alignment boundaries.  Often 
  1016. applications contain unused code or data that is linked into the final 
  1017. executable image.  Some development tools and techniques can prevent standard 
  1018. linkers from detecting unused code. 
  1019.  
  1020. Files Produced 
  1021. When processing has completed the original application file is replaced by a 
  1022. special recording version.  The original file is renamed to have an '.ORI' 
  1023. extension. 
  1024.  
  1025. A special recording DLL is also created to assist with runtime recording.  The 
  1026. name of this DLL is generated by placing an '@1' at the end of the root name 
  1027. and adding a '.DLL' extension.  For example, processing of 'MYAPP.EXE' will 
  1028. create the recording DLL 'MYAPP_@1.DLL'.  The numeric value is altered if 
  1029. necessary to ensure generation of a unique file name. 
  1030.  
  1031. Special Options 
  1032. Some applications may require special options for recording to increase 
  1033. performance or alter the distribution of the overhead of the recording process. 
  1034. Often the most simple solution for timing problems is to record on a higher 
  1035. performance PC or remove timing sensitive code from the processed code object. 
  1036.  
  1037. See the /buff, /compress, /thread and /recfile options for more information. 
  1038.  
  1039. Note:     If you intend using this software on files greater than 1Mb in size 
  1040.           and are using OS/2 WARP prior to application of FixPak 11 there is a 
  1041.           workaround for a software fault of which you MUST be aware.  See 
  1042.           Urgent Message for details. 
  1043.  
  1044.  
  1045. ΓòÉΓòÉΓòÉ 6.1.3. Recording Program Statistics  ΓòÉΓòÉΓòÉ
  1046.  
  1047.  Recording Program Statistics
  1048.  
  1049. To record program statistics run your prepared EXE/DLL performing the 
  1050. operations to be typically performed by the user.  The quality of recording 
  1051. information directly affects the performance of LXOPT and is the most important 
  1052. part of the optimising process. 
  1053.  
  1054. During the recording process the recording DLL generated during preparation 
  1055. (e.g. 'MYAPP_@1.DLL') must be somewhere on your LIBPATH.  By default this DLL 
  1056. was created in the directory of the processed EXE/DLL file.  Typically LIBPATH 
  1057. contains the current directory '.' which often allows the DLL to be found at 
  1058. its default location. 
  1059.  
  1060. If your application consists of multiple EXE/DLL files you may prepare and 
  1061. record all of them simultaneously. 
  1062.  
  1063. Recording Strategy 
  1064. The purpose of recording is to tell LXOPT where and when instructions are 
  1065. normally executed and identify which are rarely or not normally used.  During 
  1066. the recording session you perform operations that you would normally expect of 
  1067. the user.  Avoiding unusual program conditions while recording will greatly 
  1068. enhance the effectiveness of LXOPT.  DO NOT be tempted to use preprepared test 
  1069. scripts designed to test program stability, these rarely mimic true user 
  1070. behaviour. 
  1071.  
  1072. A good general rule is to start your application and do the most commonly 
  1073. performed actions first.  Then progress through the interface in order based on 
  1074. expected frequency of use.  If you wish to focus tuning on a specific area of 
  1075. the code simply execute that code more frequently. 
  1076.  
  1077. Recording (.REC) Files 
  1078. During execution your application will create a recording file which by default 
  1079. is the name of the processed file with a '.REC' extension. Your application may 
  1080. be used for more than one recording session, each session appends its results 
  1081. to the existing recording. 
  1082.  
  1083. Recording sessions may also be performed on separate machines, the files 
  1084. concatenated later to form one continuous recording.  If you wish to record 
  1085. multiple instances of your application at the same time a separate recording 
  1086. file is created for each instance. These special circumstances require special 
  1087. treatment of the recording file(s), see the /recfile option for more details. 
  1088.  
  1089. Special Options 
  1090. If recording seems slow or your application is timing sensitive the /buff, 
  1091. /thread, /compress and /recfile options can all help to reduce the recording 
  1092. overhead if used when creating a recording version. 
  1093.  
  1094. If an error is detected during recording a two pitch alternating tone is 
  1095. generated and an error message placed in the file 'LXREC.ERR'.  An attempt will 
  1096. then be made to display the error message on screen.  This will normally 
  1097. succeed but given the unknown state of the application it cannot be guaranteed. 
  1098. The application will then terminate with error code 99. 
  1099.  
  1100. WARNING: 
  1101.  
  1102. Recording may create large recording files ranging from a few Kb to several 
  1103. hundred Mb in size.  Running out of disk space will cause recording to fail and 
  1104. may impair other applications if recording files are placed on the same drive 
  1105. as your swap file. 
  1106.  
  1107. The recording file pathname may be specified using the /recfile option and the 
  1108. recording file may be reduced in size by the /compress option.  You are advised 
  1109. to start with a short recording session to judge the disk space requirements 
  1110. for your application. 
  1111.  
  1112.  
  1113. ΓòÉΓòÉΓòÉ 6.1.4. Creating An Optimised Code Arrangement  ΓòÉΓòÉΓòÉ
  1114.  
  1115.  Creating An Optimised Code Arrangement
  1116.  
  1117. When a recording has been created LXOPT is used with the /arrange parameter to 
  1118. create an optimised layout. 
  1119.  
  1120. To use all defaults select LXOPT Arrange from the Open menu or using the 
  1121. command line type: 
  1122.  
  1123.     LXOPTD <exe/dll path name> /arrange
  1124.  
  1125. If you wish to preload the resulting file you must also specify the /preload 
  1126. parameter.  This option is also available as LXOPT Arrange Preload on the Open 
  1127. menu. 
  1128.  
  1129. As with preparation, LXOPT may take a significant time to complete when 
  1130. processing large input files. 
  1131.  
  1132. Performance Testing 
  1133. If you wish to compare performance between the original and optimised 
  1134. applications please read the Performance Testing section.  Caching effects of 
  1135. the operating system, network servers and disk caches need to be considered to 
  1136. ensure valid results. 
  1137.  
  1138. This demonstration version of LXOPT produces files which will refuse to execute 
  1139. if the operating system was not booted within the last 30 minutes.  The files 
  1140. will also stop executing 7 days after creation. 
  1141.  
  1142. Files Produced 
  1143. When complete the optimised EXE/DLL file is created and overwrites the existing 
  1144. recording version. 
  1145.  
  1146. The recording version of the file is renamed with a '.PRP' extension. 
  1147.  
  1148. The original application file remains with a '.ORI' extension. 
  1149.  
  1150. Arrangement Report 
  1151. When a new arrangement has been created LXOPT performs a page fault simulation 
  1152. on the original and optimised versions.  The test simulates the execution of 
  1153. the entire recording session with the original and optimised versions of the 
  1154. application file.  The results are analysed and used to generate a comparative 
  1155. report for a series memory load conditions.  See Reading Reports for an 
  1156. explanation of the information displayed. 
  1157.  
  1158. Production of a report may be disabled using the /noreport option 
  1159.  
  1160. Recording Files 
  1161. LXOPT arrangement uses a single recording file which by default is the EXE/DLL 
  1162. path name with a '.REC' extension.  If you wish to specify another file or use 
  1163. multiple files please see the /recfile option for more details. 
  1164.  
  1165. Alternative Arrangement Algorithms 
  1166. LXOPT uses named arrangement algorithms to create optimised code layouts. 
  1167. Although the default algorithm is generally the best, algorithm performance is 
  1168. dependent on program structure and can vary dramatically.  For information on 
  1169. customising the optimisation phase refer to the /alg option. 
  1170.  
  1171. CS:EIP Based Messages 
  1172. Many applications use the current instruction pointer as part of their fatal 
  1173. error messages.  The default exception handler also provides this information. 
  1174. Developers often use a .MAP file to trace back these pointers to the offending 
  1175. code.  The movement of assembler sequences within the processed code object 
  1176. means that offsets within this region will have altered.  LXOPT provides the 
  1177. /getOld and /getnew options to translate these offsets between the old and new 
  1178. versions of the executable. 
  1179.  
  1180.  
  1181. ΓòÉΓòÉΓòÉ 6.2. Reading Reports  ΓòÉΓòÉΓòÉ
  1182.  
  1183.  Reading Reports
  1184.  
  1185. When the arrangement process is complete LXOPT generates a report to show how 
  1186. effectively the new instruction layout will reduce page faults due to the 
  1187. loading of application code. 
  1188.  
  1189. The data for this report is generated using a simulation of the page fault 
  1190. behaviour of the old and new code layouts for a range of available free memory. 
  1191. The execution history generated by the recording process is used to recreate 
  1192. the flow of control throughout the lifetime of the application. 
  1193.  
  1194. OS/2 is an advanced multitasking operating system and as such the resources 
  1195. allocated to an application will vary dynamically based on system load.  To 
  1196. allow production of a meaningful report page fault data is generated for fixed 
  1197. amounts of available memory. 
  1198.  
  1199. A typical report appears below: 
  1200.  
  1201. Calculating page faults loading instructions from code object 1 ...
  1202.  
  1203.  Memory (Kb)      Old Faults      New Faults      Percentage Reduction
  1204.           28           13187            4014             69%
  1205.           84            2048             290             85%
  1206.          140             743              58             92%
  1207.          196             461              43             90%
  1208.          252             337              43             87%
  1209.          308             240              43             82%
  1210.          364             182              43             76%
  1211.          420             160              43             73%
  1212.          476             144              43             70%
  1213.          532             131              43             67%
  1214.  
  1215.  
  1216.  375161 bytes (63%) of the code was parked.
  1217.  
  1218. Each row of the table details page fault behaviour for a fixed amount of 
  1219. available memory.  To take the first row, if code object 1 were restricted to 
  1220. the use of 28Kb of memory the old version would generate 13,187 page faults 
  1221. while executing the recording sequence.  The new code layout would generate 
  1222. 4,014 page faults, a 9,173 (69%) reduction. 
  1223.  
  1224. Code parking often has a significant effect on the arrangement process and in 
  1225. the above example roughly 366Kb was parked (i.e. 375,161 bytes of unused code 
  1226. fragments were collected from throughout the application and placed together at 
  1227. the end of the code area). 
  1228.  
  1229. The last row of the table shows the number of page faults generated when all 
  1230. the memory the code needs is available. This figure is never zero as 
  1231. application code is always loaded via page faults (*).  As no page is ever 
  1232. forced out the number of page faults is equal to the total number of pages 
  1233. referenced.  The old layout used 131 pages (524Kb) while the new code layout 
  1234. uses 43 pages (172Kb) a reduction of 88 pages (352Kb) or 67%.  This is the 
  1235. reason why for a range of available memory the new code layout causes 43 page 
  1236. faults, 43 pages (172Kb) of memory is all that is required to load all of the 
  1237. executed code. 
  1238.  
  1239. So has the applications total memory requirements been reduced by 67%?  No. 
  1240. All figures in the table relate to page faults loading instructions from the 
  1241. processed code object, all references to data and resources remain unaltered. 
  1242. If your application is relatively small but manipulates large amounts of data 
  1243. the effect may even go unnoticed.  If your applications memory requirements are 
  1244. primarily due to the size of the code then the effect can be transformative. 
  1245.  
  1246. (*) OS/2 V2.0 and later ignore the PRELOAD option. 
  1247.  
  1248.  
  1249. ΓòÉΓòÉΓòÉ 6.3. Preloading  ΓòÉΓòÉΓòÉ
  1250.  
  1251.  Preloading
  1252.  
  1253. Preloading (transferring exe/dll files to the swapfile) can give a significant 
  1254. load time performance boost at the expense of additional swapfile space 
  1255. consumption and initial preloading delays (normally at boot/network connection 
  1256. time).  For a file to be preloaded it must have been arranged using the 
  1257. /preload option.  The resulting file will execute normally until preloaded 
  1258. using the Preload Utility. 
  1259.  
  1260. Use of preloading also raises other more subtle issues. 
  1261.  
  1262. DLL Initialisation 
  1263. Applications are preloaded by use of the DosStartSession and DosLoadModule 
  1264. APIs. 
  1265.  
  1266. When preloaded via the preload utility no DLL initialisation code is executed 
  1267. in DLLs that have been arranged with the /preload option.  This is required to 
  1268. ensure transparent operation and also to protect the preloading mechanism from 
  1269. harm.  No EXE file code is ever executed.  The only exception is for DLLs with 
  1270. global initialisation for which normal start-up is performed. 
  1271.  
  1272. When a DLL/EXE is loaded, so are all the DLLs on which it depends.  The DLLs 
  1273. not processed by LXOPT will initialise normally and are not preloaded. 
  1274.  
  1275. This places constraints on the actions that may be performed while executing 
  1276. the _DLL_InitTerm function within unprocessed or global init DLLs used by an 
  1277. LXOPT preloadable file.  In these circumstances the _DLL_InitTerm routine 
  1278. should not attempt any user interaction or perform any action likely to 
  1279. materially affect other client processes.  It should also not attempt to access 
  1280. functions exported by other LXOPT processed DLLs, their DLL initialisation will 
  1281. not have been performed making exported functions unreliable. 
  1282.  
  1283. Although it is very unusual for such DLL initialisation code to exist it is 
  1284. extremely important that this restriction is not violated. 
  1285.  
  1286. Philosophical Issues 
  1287. Preloading is a compromise.  It trades the performance boost of application 
  1288. paging against increased use of machine resources; namely swap space and 
  1289. preload (usually boot) time. 
  1290.  
  1291. Problems appear where each application considers itself "important" enough to 
  1292. be preloaded.  Clearly if a users machine were to load every piece of software 
  1293. they possess every time the machine booted preloading would quickly become 
  1294. counter productive. 
  1295.  
  1296. OS/2 used to permit the preloading of segments with the PRELOAD segment keyword 
  1297. in module definition files.  The loader would read all PRELOAD segments into 
  1298. memory on application start-up.  Unlike the LXOPT preload, this OS/2 preloading 
  1299. only took effect when the user attempted to start an application.  PRELOAD 
  1300. segments were loaded but often at the expense of other executing applications. 
  1301. Although tools still support this option and indicate preload requirements in 
  1302. the executable files they produce the operating system now ignores them.  A 
  1303. major factor in this is the potential abuse of PRELOAD to boost a single 
  1304. applications apparent performance at the expense of the rest of the system. 
  1305.  
  1306. LXOPT preloadable files are preload enabled, they do not automatically preload 
  1307. by themselves.  This is deliberate.  By requiring the use of the preload 
  1308. utility the decision to preload is taken away from the developer and given to 
  1309. the user. 
  1310.  
  1311. Your development tools are a good example of the issues involved.  If you use 
  1312. them on a daily basis then preloading all the executables and DLLs may be very 
  1313. beneficial but it is hardly warranted if development is confined to an annual 
  1314. tweak of an in-house utility. 
  1315.  
  1316. In general do not make assumptions about the desirability of preloading your 
  1317. application.  If you are working set tuning your software with LXOPT, enable 
  1318. preloading and deploy with the preload utility wherever possible.  Users 
  1319. sometimes run server applications intermittently while apparently trivial 
  1320. applications are often executed thousands of times within automated scripts. 
  1321.  
  1322. Deployment Issues 
  1323. The Preload Utility which accompanies LXOPT is freely distributable with your 
  1324. application.  Remember that a users installation may already be using the 
  1325. preload utility.  Two issues arise, where to put it and what to do if the files 
  1326. already exist.  Preload needs to be available prior to network availability. 
  1327. It is therefore recommended that the preload utility is stored in the 
  1328. "\PRELOAD" directory on the OS/2 boot drive.  If the utility already exists 
  1329. follow the simple rule that if the files have a more recent creation date than 
  1330. the ones supplied with your application, leave them alone!.  Future versions of 
  1331. the preload utility will maintain backwards compatibility. 
  1332.  
  1333. The preloader operates by copying the entire processed file into the swapfile. 
  1334. The original application file on disk is closed and all further page loading is 
  1335. performed directly from the swapfile.  While this reduces the page loading 
  1336. overhead it also increases disk space requirements on the swap drive.  Running 
  1337. out of swap space may make the system unstable.  If the problems are caused by 
  1338. commands in startup.cmd it will make recovery more difficult.  By default the 
  1339. preload utility will refuse to preload a file if there is less than 10Mb of 
  1340. free swap space.  If your application installation places preload commands in 
  1341. startup.cmd and predict the need for greater free space use the /M option. 
  1342.  
  1343.  
  1344. ΓòÉΓòÉΓòÉ 6.4. Working Set Tuning  ΓòÉΓòÉΓòÉ
  1345.  
  1346.  Working Set Tuning
  1347.  
  1348. Working set tuning is the act of optimising the arrangement of information to 
  1349. be stored in a cache to allow the most efficient operation of the caching 
  1350. mechanism. 
  1351.  
  1352. When an operating system manages pages of memory the system RAM effectively 
  1353. becomes a giant cache.  4Kb code and data pages travel via this cache from 
  1354. executable files or the swapfile on their way to the processor in the same way 
  1355. that files travel through a disk cache.  The success of caching relies on the 
  1356. non random nature of access requests.  The greater the locality of reference 
  1357. the more efficiently a cache operates. 
  1358.  
  1359. The path of execution through code is not random.  Instructions execute in 
  1360. sequences broken up by transfers of control such as CALL or JMP instructions. 
  1361. It is these transfers of control that often produce a 'cache miss' resulting in 
  1362. a disk access.  While the targets of these transfers are sometimes some 
  1363. distance from the current instruction pointer the destination is often known or 
  1364. predictable.  It is this predictability on which a working set tuner for code 
  1365. is based. 
  1366.  
  1367. Code Arrangement 
  1368. When applications are divided into pages it is done without regard to the 
  1369. underlying contents, every 4096 bytes the code is indiscriminately severed. 
  1370. Functions and even individual instructions are split across page boundaries. 
  1371. What appears on each page is dictated by the order of the code within the 
  1372. executable file.  What dictates that order?  You do. 
  1373.  
  1374. Within each compilation unit the order in which code appears is generated by 
  1375. the compiler.  It builds the instruction sequences and orders them roughly as 
  1376. they appear in the source file.  The linker takes each object file and 
  1377. concatenates the contents, appends any used libraries and outputs the 
  1378. executable.  The result is that code within an executable will appear in the 
  1379. order that it is typed in the source files and the order in which those files 
  1380. are processed by the linker. 
  1381.  
  1382. Well so what? - if code is only loaded when referenced then there's no problem, 
  1383. right?  Take a look at the two code layouts below where A to L are individual 
  1384. code sequences which for simplicity have been grouped 3 to each 4Kb page. 
  1385.  
  1386.                     ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1387.                     Γöé          Γöé Page 1 Γöé Page 2 Γöé Page 3 Γöé Page 4 Γöé
  1388.                     Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1389.                     Γöé Untuned: Γöé A,B,C  Γöé D,E,F  Γöé G,H,I  Γöé J,K,L  Γöé
  1390.                     Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1391.                     Γöé   Tuned: Γöé G,E,D  Γöé L,B,C  Γöé H,I,K  Γöé A,F,J  Γöé
  1392.                     ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1393.                                              Untuned vs Tuned Code Layout 
  1394.  
  1395.  Reduced Code Memory Requirements 
  1396.  If the normal path of execution is "GEDLBLBLBCHIK" the benefits of the tuned 
  1397.  layout become clearer.  The normal layout loads four pages in the sequence 
  1398.  3241, the tuned layout loads only three pages in the sequence 123. Both 
  1399.  layouts contained and executed the same code but the tuned layout avoided one 
  1400.  disk access and used 25% less memory. 
  1401.  
  1402.  This memory saving is a direct result of the sequences A, F and J not being 
  1403.  executed.  If this seems contrived consider that on average between 30% and 
  1404.  50% of a typical applications code is loaded but not executed during normal 
  1405.  operation.  If that sounds high examine your own code for error handling of 
  1406.  memory allocation, file access or OS/2 API errors.  Include with this the code 
  1407.  that your users will rarely execute such as routines handling the import of 
  1408.  that obscure file format, changing application configuration or displaying 
  1409.  that list of programmer credits (try clicking on the Warp desktop and then 
  1410.  press Ctrl-Alt-Shift-O).  Often such code appears within branches of IF or 
  1411.  CASE statements, lying dormant inside otherwise active functions.  In an 
  1412.  untuned code layout much of this code is loaded because it happens to share 
  1413.  part of a code page with some other active code sequence. 
  1414.  
  1415.  Performance In Low Memory Conditions 
  1416.  Limit the code sequence to the use of one 4Kb page as a crude simulation of 
  1417.  low memory conditions and more significant differences emerge.  The normal 
  1418.  layout will execute as "GEdLBLBLBcHiK" where an upper case character 
  1419.  represents the need to load a page from disk.  The result is a total of 10 
  1420.  page loads.  The tuned layout sequence is "GedLblblbcHik".  The total of 3 
  1421.  page loads has been unchanged by the restriction to one page of memory. 
  1422.  
  1423.  The reduction in page faults is due to the way that tuned code layouts group 
  1424.  code by time of execution.  When a tuned application executes a CALL or JMP 
  1425.  instruction the target is much more likely to be on the same page of memory. 
  1426.  In low memory conditions any attempt to execute an instruction on all but the 
  1427.  most recently used pages is likely to be punished by a page fault. 
  1428.  
  1429.  While this small example conveys the basic principles, in reality the 
  1430.  situation is much more complex. A typical code page contains not 3 but 300 
  1431.  separate code sequences and OS/2 recycles each page on approximately a least 
  1432.  recently used basis.  In low memory conditions applications and the operating 
  1433.  system compete for ownership of these memory pages, the number of pages 
  1434.  available to an application varying dynamically based on current demand.  As a 
  1435.  result, when working set tuned code is executed the reduced memory 
  1436.  requirements benefit not just the tuned software but all other executing 
  1437.  applications. 
  1438.  
  1439.  
  1440. ΓòÉΓòÉΓòÉ 6.5. CPU Instruction Caching  ΓòÉΓòÉΓòÉ
  1441.  
  1442.  CPU Instruction Caching
  1443.  
  1444. Level 1 CPU cache memory is a limited and valuable resource.  Modern processors 
  1445. require these caches to allow the instruction pipelines to be fed at their 
  1446. maximum rate.  The Intel Pentium processor implements an 8Kb on chip 
  1447. instruction cache.  Compared to the size of modern applications 8Kb is 
  1448. extremely small and operational efficiency depends on its ability to contain 
  1449. small repeatedly executed code sequences (such as program loops) in their 
  1450. entirety. 
  1451.  
  1452. There are three inefficiencies in the use of CPU instruction caches that LXOPT 
  1453. addresses. 
  1454.  
  1455. Processor Caching Algorithm 
  1456. The unit of storage within a cache is the 'cache line' which on a Pentium 
  1457. processor is 32 bytes long.  These cache lines are analogous to the 512 byte 
  1458. block storage units in a disk cache. 
  1459.  
  1460. Ideally an instruction cache would operate using a pure Least Recently Used 
  1461. algorithm to maximise the chances of keeping repetitive instruction sequences 
  1462. within the cache.  But caches are high speed devices, often with access times 
  1463. of less than 10 nanoseconds.  Time constraints prevent the implementation of 
  1464. optimal algorithms.  Early devices used a simple direct mapping approach where 
  1465. some bits from an address were used to directly address a cache line. 
  1466.  
  1467.                                 Tag        Line Adr
  1468.        Binary Address:  00110110110001001110001011000010
  1469.  
  1470. In the example above 8 bits are used from the address to identify the cache 
  1471. line to use.  This gives us 256 possible cache lines or 8Kb of total cache 
  1472. assuming a 32 byte line.  A problem occurs where two memory locations need to 
  1473. be cached that have the same bit pattern for the cache line address.  As each 
  1474. location is loaded the previous occupier of the cache line is pushed out.  For 
  1475. simple assembler loops this rarely occurs, but if the loop contains a call to a 
  1476. function with a clashing address performance suffers dramatically. 
  1477.  
  1478. Hardware designers responded to this problem with the set associative cache. 
  1479.  
  1480.                                   Tag       Line Adr
  1481.        Binary Address:  00110110110001001110001011000010
  1482.  
  1483. Here the cache line address is reduced to 7 bits giving a total of 128 
  1484. addresses but now the cache holds 2 cache lines per address.  The cache 
  1485. maintains an LRU mechanism within each group of two lines.  The total cache 
  1486. size is unchanged but it is now more flexible, reducing the number of clashes 
  1487. which force out useful cache lines.  The use of 2 cache lines per address (2 
  1488. way) set associative cache is the method used by the Pentium processor.  The 
  1489. recently announced P6 also uses an 8Kb 2 way set associative instruction cache. 
  1490. The 486 processor uses a 4 way set associative cache with a 16 byte cache line. 
  1491.  
  1492. Set associative caches reduce cache line address clashes but do not eliminate 
  1493. the problem.  Modern applications, unlike simple benchmark code, contain deep 
  1494. hierarchies of programming constructs that can significantly increase the risk 
  1495. of clashes.  When these occur not only is instruction fetching delayed but the 
  1496. use of the external bus blocks other data memory access.  When clashes occur 
  1497. subsequent sequential instruction fetches are also much more likely to push out 
  1498. reusable cache lines.  While these valuable cache lines are discarded, old 
  1499. unneeded lines are retained by virtue of their uncontested cache line address. 
  1500.  
  1501. LXOPT organises instructions such that commonly executed code is laid out in 
  1502. near sequential form.  This is the most efficient ordering for the instruction 
  1503. cache as it minimises the chances of related code sequences having the same 
  1504. cache line address.  The resulting more sequential order of cache line loads 
  1505. allows the cache to perform as if a near pure LRU algorithm had been 
  1506. implemented. 
  1507.  
  1508. Reduced Cache Line Wastage 
  1509. Grouping commonly executed code together has another simple benefit, it moves 
  1510. rarely executed code elsewhere. 
  1511.  
  1512. The Intel x86 instruction set was designed with memory efficiency as a high 
  1513. priority and many of the most commonly executed instructions are contained 
  1514. within a single byte.  The average size of an uninterrupted sequence of 
  1515. assembler instructions is only 13 bytes.  As a result almost every cache line 
  1516. will span two or more separate instruction sequences.  If these sequences are 
  1517. not closely grouped by time of execution then significant portions of the cache 
  1518. are wasted. 
  1519.  
  1520. LXOPT arranges code by dividing code into each uninterrupted sequence and 
  1521. tracing its use.  On arrangement these sequences are recombined based on time 
  1522. of execution, exactly the criteria for the least cache memory waste. 
  1523.  
  1524. Target Alignment 
  1525. The third instruction caching benefit is also the result of the sequential 
  1526. grouping of executed code.  Most modern compilers align code reached by 
  1527. transfer instructions (such as the start of procedures) on a 16 byte boundary. 
  1528. The principle is simple, once the procedure is reached the most efficient thing 
  1529. to do is minimise the number of cache line reads.  Up to 15 bytes of padding 
  1530. must be inserted to ensure 16 byte paragraph alignment. 
  1531.  
  1532. This is clearly a good strategy in normal circumstances but LXOPT processed 
  1533. code is no longer 'normal'.  After processing, the instructions immediately 
  1534. preceding the aligned procedure are very likely to already be inside the 
  1535. instruction cache.  LXOPT has grouped code by time of use.  Even if the code is 
  1536. not already in the cache it is likely to be needed in the immediate future. 
  1537. Padding code out to 16 byte boundaries is now a less attractive proposition. 
  1538. Most instruction padding becomes a waste of valuable CPU cache memory. 
  1539.  
  1540. The benefit of improved locality of reference is enhanced if the result of a 
  1541. transfer instruction has come as a surprise to the processors instruction 
  1542. prefetch mechanism.  If the new target is already in the cache the initial 
  1543. instructions may be fed directly to the execution unit, keeping it busy while 
  1544. the instruction prefetch struggles to regain its lead over the execution 
  1545. pipeline(s). 
  1546.  
  1547. Removal of all padding is not necessarily optimal even after LXOPT processing. 
  1548. Performance of the 486 processor can be degraded where an instruction crosses 
  1549. an alignment boundary. 
  1550.  
  1551. LXOPT removes padding between arranged code but allows the developer to choose 
  1552. how many bytes of CPU cache to waste to ensure alignment on a cache line 
  1553. boundary. /cLineSize:<size> (default 16) permits the developer to specify the 
  1554. target cache line size and /cLineWaste:<waste_bytes> (default 3) specifies how 
  1555. many bytes of cache line you are willing to waste to ensure alignment. 
  1556.  
  1557.  
  1558. ΓòÉΓòÉΓòÉ 6.6. Performance Testing  ΓòÉΓòÉΓòÉ
  1559.  
  1560.  Performance Testing
  1561.  
  1562. The first reaction of a developer after creating a new program arrangement is 
  1563. to test that the application behaves and performs as expected. 
  1564.  
  1565. Next is to reach for the stopwatch and test to see how much of a performance 
  1566. improvement has been achieved.  Normal performance testing involves executing 
  1567. the original and processed versions of the application through a pre-set 
  1568. sequence of tests and comparing the execution times.  There are several issues 
  1569. that a developer should be aware of when performance testing LXOPT processed 
  1570. code. 
  1571.  
  1572. Although LXOPT performs some minor CPU related optimisations, its primary role 
  1573. is still that of a working set tuner. 
  1574.  
  1575. When OS/2 manages the allocation and recycling of 4Kb pages of memory it is 
  1576. effectively performing the role of a cache controller.  In a virtual memory 
  1577. environment your system RAM has become a giant cache memory.  LXOPT operates by 
  1578. arranging your code to allow this cache to work as efficiently as possible. 
  1579.  
  1580. When your application executes it results in the loading of code pages from not 
  1581. only the application executable but from other DLLs on which it depends.  When 
  1582. an application terminates many of these DLLs code pages remain in memory. 
  1583. Execution of the application has changed the set of code pages that were in 
  1584. memory.  This caching of code pages will result in varying execution times for 
  1585. actions which appear to the user to be equivalent. 
  1586.  
  1587. Caching is used not just by OS/2 but by the file system(s) and often disk 
  1588. access hardware.  If you are working on a network your file server is caching 
  1589. there too.  This caching which is normally of great benefit is also a major 
  1590. obstacle to valid performance testing.  As a developer you may have recently 
  1591. created or executed the code to be tested.  Either way you will have caused the 
  1592. contents of the executable file to pass through the cache(s) on the way to or 
  1593. from the disk.  Program data files may benefit/suffer from similar effects. 
  1594.  
  1595. For valid testing we need an equal playing field with all code starting out on 
  1596. disk.  The most simple and effective way to do this is to restart your machine, 
  1597. wait for all disk activity to cease (wait for 3 whole minutes of inactivity) 
  1598. and then time the execution of the original application.  Repeat this process 
  1599. for the LXOPT processed version and the runtimes can be reliably compared. 
  1600. Avoid using code or data files on a shared file server for obvious reasons. 
  1601.  
  1602. The program utility TimeRun will assist in measuring the run time of an 
  1603. application. 
  1604.  
  1605. Remember also that OS/2 is a multitasking operating system and other tasks are 
  1606. always executing together with your own.  This may become a problem if these 
  1607. other tasks behave differently between test runs.  The simple act of moving a 
  1608. mouse pointer over another window or forcing an additional redraw may 
  1609. significantly affect results as code is loaded and executed to handle these 
  1610. actions. 
  1611.  
  1612. The working set tuning benefits of LXOPT in percentage terms are reasonably 
  1613. consistent across applications but other factors affect how this translates 
  1614. into performance improvements.  LXOPT reduces the overhead of loading code and 
  1615. the memory needed to store it.  A 50Kb application that manipulates 10Mb of 
  1616. data will benefit little from working set tuning of code.  If you are 
  1617. evaluating LXOPT for use on a large project do not performance test on a 'Hello 
  1618. World' type program, the only way to obtain reliable results is to test with 
  1619. the intended application. 
  1620.  
  1621. The ratio of code size to available system memory is another major influence. 
  1622. Developers tend to have the fastest disks, modern controllers and more system 
  1623. RAM than other types of computer users.  Working set tuning really shows its 
  1624. worth when a tuned application is executed in a restricted memory environment. 
  1625. When performance testing try using a machine typical of your users.  Using a 
  1626. machine with only 8Mb or less will help to simulate low memory conditions. 
  1627. Alternatively use the program utility Thrash while performance testing your 
  1628. application.  This utility will simulate the low memory conditions that can be 
  1629. created by other memory hungry applications. 
  1630.  
  1631. Ultimately memory savings will depend on application size.  Pages not used by 
  1632. your application are free for use by all.  These free pages are allocated to 
  1633. applications on demand by OS/2.  If your application is the major consumer of 
  1634. memory then it will have the greatest reward.  Trivial short-lived applications 
  1635. are usually not memory restricted as memory pages allocated to them will rarely 
  1636. be loaded long enough to reach the end of the LRU page queue.  The benefit here 
  1637. is a shortened load time and reduced impact on the rest of the system. 
  1638.  
  1639. In an ideal world all code would be working set tuned.  Assuming a 50:50 code 
  1640. to data ratio the combined effect would be equivalent to a RAM upgrade of 
  1641. approximately 25% for all OS/2 users. 
  1642.  
  1643. Note:     The Demonstration version of this software alters the final 
  1644.           application to report if the machine has not been rebooted within the 
  1645.           last 30 minutes.  This is designed to encourage valid testing and is 
  1646.           one of the few differences from the standard version of the software. 
  1647.           This test will cause the resulting application to generate up to 
  1648.           three more page faults than that produced with the standard version. 
  1649.  
  1650.  
  1651. ΓòÉΓòÉΓòÉ 6.7. Patch for CSet++ V2.0 and 2.1 Users  ΓòÉΓòÉΓòÉ
  1652.  
  1653.  Patch for CSet++ V2.0 and 2.1 Users
  1654.  
  1655. LXOPT requires internal fixups to be retained within executable files.  LINK386 
  1656. will remove these internal fixups if it is invoked with the '/base' option. 
  1657. When ICC.EXE initiates a link of an EXE file it automatically passes this 
  1658. option to LINK386. 
  1659.  
  1660. Although many users can invoke LINK386 directly, ICC requires that applications 
  1661. using C++ templates use ICC to initiate the link.  Under these circumstances it 
  1662. is impossible to prevent the setting of a base address. 
  1663.  
  1664. LXOPT contains the program ICCPATCH.EXE which disables this behaviour in 
  1665. ICC.EXE.  The patch locates the parameter string within ICC.EXE and removes it, 
  1666. preventing it from being passed to the linker. 
  1667.  
  1668. Usage of ICCPATCH is: 
  1669.  
  1670. [C:\DEVTOOLS\IBMCPP\BIN] ICCPATCH ICC.EXE
  1671.  
  1672. Make a copy of the file before you patch it, the given file is altered in 
  1673. place.  If ICCPATCH reports that it is unable to open the file it is likely 
  1674. that ICC.EXE is still in memory.  Type 'ICC /tl-' and reattempt the patch. 
  1675.  
  1676. Providing a base address of 65536 for an EXE file is good practice and should 
  1677. normally always be observed.  Based executables will be a little smaller and 
  1678. load a little faster, which is the reason ICC provides a base address by 
  1679. default.  After applying the patch be sure to provide the '/base:65536' 
  1680. parameter to the linker via ICC.EXE (/B"/base:65536") for all executables which 
  1681. are not to be processed by LXOPT. 
  1682.  
  1683. DLLs require no such action and if you plan to apply LXOPT only to DLL files 
  1684. you should not apply this patch. 
  1685.  
  1686. If you later apply a CSet++ CSD you may have to reapply this patch.  Note that 
  1687. this patch is supplied by Functional Software Ltd and is not supported by IBM. 
  1688. Please direct any questions or support issues about this patch to LXOPT 
  1689. technical support. 
  1690.  
  1691.  
  1692. ΓòÉΓòÉΓòÉ 7. Reference  ΓòÉΓòÉΓòÉ
  1693.  
  1694.                                     Reference
  1695.  
  1696.  
  1697. ΓòÉΓòÉΓòÉ 7.1. Options  ΓòÉΓòÉΓòÉ
  1698.  
  1699.  Options
  1700.  
  1701. Options are identified by a preceding / and are not case sensitive. 
  1702.  
  1703. If an option requires a value that value must immediately follow the option 
  1704. name separated by a colon. 
  1705.  
  1706.  e.g. /alg:stat 
  1707.  
  1708.  
  1709. ΓòÉΓòÉΓòÉ 7.1.1. /alg  ΓòÉΓòÉΓòÉ
  1710.  
  1711.  /alg
  1712.  
  1713. Syntax: /alg:<binary | firstuse | stat | parkonly> 
  1714.  
  1715. Specify the algorithm to be used to generate the new code arrangement. 
  1716.  
  1717. Available algorithms are 'binary', 'firstuse', 'parkonly' and 'stat'. 
  1718.  
  1719. 'Firstuse' is a simple (and fast) arrangement algorithm which orders code 
  1720. blocks based on the order in which they are first used. 
  1721.  
  1722. 'Stat' is a more powerful algorithm which identifies the pattern of executed 
  1723. code using statistical methods and uses this to order code blocks.  The 'stat' 
  1724. algorithm is capable of producing significantly better results than 'firstuse' 
  1725. but is extremely sensitive to its /groups option. 
  1726.  
  1727. 'Binary' is a powerful arrangement algorithm which uses the recording history 
  1728. to create a binary pattern of usage for each code block.  Blocks are then 
  1729. grouped by similarity of the patterns produced. 
  1730.  
  1731. 'Parkonly' performs no arrangement other than the parking of unused code.  It 
  1732. is intended for use by developers who wish to retain control over the location 
  1733. of executed code and is not recommended for normal use. 
  1734.  
  1735. Default is to use the 'binary' algorithm. 
  1736.  
  1737.  
  1738. ΓòÉΓòÉΓòÉ 7.1.2. /align  ΓòÉΓòÉΓòÉ
  1739.  
  1740.  /align
  1741.  
  1742. Syntax: /align:<num> 
  1743.  
  1744. Specify the alignment to be given to both instruction and data pointer targets 
  1745. in the code area. Set to 1 (/align:1) for maximum compression. 
  1746.  
  1747. Alignment of code and data may be specified separately using the /alignCode and 
  1748. /alignData options.  The option "/align:16" is equivalent to "/alignCode:16 
  1749. /alignData:16". 
  1750.  
  1751. The default alignment is 1 for code pointer targets and 4 for data pointer 
  1752. targets. 
  1753.  
  1754. Use of alignment is not just a performance issue, it may be vital for some 
  1755. types of program, see restrictions for more information. 
  1756.  
  1757. Alignment of code for performance reasons is better addressed via the 
  1758. /cLineSize and /cLineWaste options.  See CPU Instruction Caching for a 
  1759. discussion of the issues involved. 
  1760.  
  1761.  
  1762. ΓòÉΓòÉΓòÉ 7.1.3. /alignCode  ΓòÉΓòÉΓòÉ
  1763.  
  1764.  /alignCode
  1765.  
  1766. Syntax: /alignCode:<num> 
  1767.  
  1768. Specify the alignment to be given to processor instructions in the processed 
  1769. code object that are referenced by a pointer.  Default is 1 for maximum 
  1770. compression. 
  1771.  
  1772. Use of alignment is not just a performance issue, it may be vital for some 
  1773. types of program, see restrictions for more information. 
  1774.  
  1775. Alignment of code is also affected by the more general /align option. 
  1776.  
  1777. Data in the processed code object may be aligned using the /alignData option. 
  1778.  
  1779. Alignment of code for performance reasons is better addressed via the 
  1780. /cLineSize and /cLineWaste options.  See CPU Instruction Caching for a 
  1781. discussion of the issues involved. 
  1782.  
  1783.  
  1784. ΓòÉΓòÉΓòÉ 7.1.4. /alignData  ΓòÉΓòÉΓòÉ
  1785.  
  1786.  /alignData
  1787.  
  1788. Syntax: /alignData:<num> 
  1789.  
  1790. Specify the alignment to be given to data in the processed code object. 
  1791. Default alignment is 4. 
  1792.  
  1793. Use of alignment is not just a performance issue, it may be vital for some 
  1794. types of program, see restrictions for more information. 
  1795.  
  1796. Alignment of data is also affected by the more general /align option. 
  1797.  
  1798. Code reached via pointer values in the processed code object may be aligned 
  1799. using the /alignCode option. 
  1800.  
  1801.  
  1802. ΓòÉΓòÉΓòÉ 7.1.5. /arrange  ΓòÉΓòÉΓòÉ
  1803.  
  1804.  /arrange
  1805.  
  1806. Syntax: /arrange 
  1807.  
  1808. Generate new code arrangement based on results of previous recording 
  1809. session(s).  Alternative is /prep. 
  1810.  
  1811. For an explanation of the arrangement process see Creating Optimised Code 
  1812. Arrangement. 
  1813.  
  1814.  
  1815. ΓòÉΓòÉΓòÉ 7.1.6. /base  ΓòÉΓòÉΓòÉ
  1816.  
  1817.  /base
  1818.  
  1819. Syntax: /base:<hex base address> (default - See below) 
  1820.  
  1821. Specify the new base address for the application file processed. 
  1822.  
  1823. By default EXE files will automatically be based at address 00010000H. 
  1824.  
  1825. By default DLL files will retain any existing base address.  If not previously 
  1826. based the DLL is given a default base of 00800000H. 
  1827.  
  1828.  
  1829. ΓòÉΓòÉΓòÉ 7.1.7. /buff  ΓòÉΓòÉΓòÉ
  1830.  
  1831.  /buff
  1832.  
  1833. Syntax: /buff:<size> (default 1024Kb) 
  1834.  
  1835. Specify the size of the recording buffer in Kb. 
  1836.  
  1837. This is the size of the recording buffer to be used while recording. 
  1838.  
  1839. Code references are stored in the buffer while recording.  Once the buffer is 
  1840. full it must be written to disk.  Writing is done as part of the application 
  1841. instance/thread being recorded. 
  1842.  
  1843. If your application is timing sensitive adjusting this value may remove timing 
  1844. problems while recording.  Valid values are from 4Kb to the maximum allocatable 
  1845. amount of virtual memory. 
  1846.  
  1847.  
  1848. ΓòÉΓòÉΓòÉ 7.1.8. /cLineSize  ΓòÉΓòÉΓòÉ
  1849.  
  1850.  /cLineSize
  1851.  
  1852. Syntax: /cLineSize:<cache_line_size> (default 16) 
  1853.  
  1854. Specifies the cache line size (and hence alignment) to be assumed for CPU cache 
  1855. optimisation.  Default is 16 bytes. 
  1856.  
  1857. Only code which cannot be reached after executing the preceding instruction in 
  1858. memory is affected by this option.  A typical example of such code is the first 
  1859. instruction of a procedure in a high level language. 
  1860.  
  1861. Together with /cLineWaste this option controls the performance related 
  1862. alignment of code within the processed code object.  In combination these 
  1863. options allow the developer to influence CPU cache efficiency. 
  1864.  
  1865. See CPU Instruction Caching for a discussion of the issues involved. 
  1866.  
  1867.  
  1868. ΓòÉΓòÉΓòÉ 7.1.9. /cLineWaste  ΓòÉΓòÉΓòÉ
  1869.  
  1870.  /cLineWaste
  1871.  
  1872. Syntax: /cLineWaste:<cache_waste_bytes> (default 3) 
  1873.  
  1874. Specifies the number of bytes of a CPU cache line the developer is willing to 
  1875. waste to ensure that code reached only via transfer instructions aligns on a 
  1876. cache line boundary.  Default is 3 bytes. 
  1877.  
  1878. Only code which cannot be reached after executing the preceding instruction in 
  1879. memory is affected by this option.  A typical example of such code is the first 
  1880. instruction of a procedure in a high level language. 
  1881.  
  1882. Together with /cLineSize this option controls the performance related alignment 
  1883. of code within the processed code object.  In combination these options allow 
  1884. the developer to influence CPU cache efficiency. 
  1885.  
  1886. See CPU Instruction Caching for a discussion of the issues involved. 
  1887.  
  1888.  
  1889. ΓòÉΓòÉΓòÉ 7.1.10. /compress  ΓòÉΓòÉΓòÉ
  1890.  
  1891.  /compress
  1892.  
  1893. Syntax: /compress:<comp_distance> (default 50) 
  1894.  
  1895. Compress recording by only recording code references not used within the last 
  1896. 'comp_distance' recorded items. 
  1897.  
  1898. As each use of code is detected the recorder checks to see how recently this 
  1899. code was last recorded.  If within 'comp_distance' the use of the code is not 
  1900. recorded.  This significantly reduces the size of the recording file saving 
  1901. disk space and the time taken to write the data. 
  1902.  
  1903. Compressed recording has a higher CPU and memory overhead but this overhead is 
  1904. unaffected by the size of 'comp_distance'. 
  1905.  
  1906. Performance of the stat arrangement algorithm is progressively degraded by 
  1907. increasing values of 'comp_distance'.  Performance of the other arrangement 
  1908. algorithms is relatively unaffected by compression. 
  1909.  
  1910. The frequency with which recordings are flushed to disk may be altered by the 
  1911. /buff option. 
  1912.  
  1913.  
  1914. ΓòÉΓòÉΓòÉ 7.1.11. /disasm  ΓòÉΓòÉΓòÉ
  1915.  
  1916.  /disasm
  1917.  
  1918. Syntax: /disasm:<hex offset> (default 0) 
  1919.  
  1920. Perform disassembly beginning at the given offset into the code object. 
  1921.  
  1922. For performance reasons the disassembly does not take advantage of the code 
  1923. identification features of LXOPT but performs a 'blind' disassembly as 
  1924. typically provided by a debugging tool. 
  1925.  
  1926. The default number of bytes to disassemble is 50 but can be altered via the 
  1927. /dislen option. 
  1928.  
  1929.  
  1930. ΓòÉΓòÉΓòÉ 7.1.12. /dislen  ΓòÉΓòÉΓòÉ
  1931.  
  1932.  /dislen
  1933.  
  1934. Syntax: /dislen:<count> (default 50) 
  1935.  
  1936. Set the number of bytes to disassemble when using the /disasm option. 
  1937.  
  1938. The locations are given and provided as hexadecimal offsets into the processed 
  1939. code object.  Offsets within other objects are not affected by LXOPT.  Note 
  1940. that translated offsets of transfer instructions may point to a different 
  1941. (possibly zero length) transfer instruction sequence in the original executable 
  1942. file. 
  1943.  
  1944. The corresponding /getNew option provides the reverse of this translation. 
  1945.  
  1946.  
  1947. ΓòÉΓòÉΓòÉ 7.1.13. /forceIntFix  ΓòÉΓòÉΓòÉ
  1948.  
  1949.  /forceIntFix
  1950.  
  1951. Syntax: /forceIntFix (default OFF) 
  1952.  
  1953. The setting of the internal fixups flag in the executable file header has 
  1954. proven to vary between development tools.  LXOPT now ignores the header flag 
  1955. and searches for internal fixups within the fixup section.  This option 
  1956. disables this test and forces LXOPT to assume that all required internal fixups 
  1957. are present in the file. 
  1958.  
  1959. This option is provided to cover the rare but theoretically possible situation 
  1960. where a file (most probably a code only DLL) does not require a single internal 
  1961. fixup.  Inappropriate use of this option will cause the produced recording 
  1962. version of the application to fail with an access violation.  DO NOT USE THIS 
  1963. OPTION UNLESS YOU ARE SURE YOUR EXE/DLL FILE DOES NOT CONTAIN A SINGLE DIRECT 
  1964. MEMORY REFERENCE. 
  1965.  
  1966.  
  1967. ΓòÉΓòÉΓòÉ 7.1.14. /getOld  ΓòÉΓòÉΓòÉ
  1968.  
  1969.  /getOld
  1970.  
  1971. Syntax: /getOld:<hex_offset> 
  1972.  
  1973. Find the original position of the code/data that is located at the given offset 
  1974. into the processed code object in the optimised executable file. 
  1975.  
  1976. The locations are given and provided as hexadecimal offsets into the processed 
  1977. code object.  Offsets within other objects are not affected by LXOPT.  Note 
  1978. that translated offsets of transfer instructions may point to a different 
  1979. transfer instruction sequence in the original executable file. 
  1980.  
  1981. The corresponding /getNew option provides the reverse of this translation. 
  1982.  
  1983.  
  1984. ΓòÉΓòÉΓòÉ 7.1.15. /getNew  ΓòÉΓòÉΓòÉ
  1985.  
  1986.  /getNew
  1987.  
  1988. Syntax: /getNew:<hex offset> 
  1989.  
  1990. Find the new position of the code/data that was located at the given offset 
  1991. into the processed code object in the original executable file. 
  1992.  
  1993. The locations are given and provided as offsets into the processed code object. 
  1994. Offsets within other objects are not affected by LXOPT.  Note that unused code 
  1995. or data from the original version of the executable may be removed by LXOPT 
  1996. optimisation and so will have no corresponding new offset. 
  1997.  
  1998. Translated offsets of transfer instructions may point to a different transfer 
  1999. instruction sequence or the transfer sequence may have been optimised out 
  2000. entirely. 
  2001.  
  2002. The /getOld option provides the reverse of this translation process. 
  2003.  
  2004.  
  2005. ΓòÉΓòÉΓòÉ 7.1.16. /groups  ΓòÉΓòÉΓòÉ
  2006.  
  2007.  /groups
  2008.  
  2009. Syntax: /groups:<group_count> (default 3) 
  2010.  
  2011. Specify the number of distribution groups into which to divide code blocks when 
  2012. using the stat algorithm. 
  2013.  
  2014. The optimum value for this setting is application specific and may require 
  2015. experimentation to achieve the best result. 
  2016.  
  2017.  
  2018. ΓòÉΓòÉΓòÉ 7.1.17. /ignoreMsgSeg  ΓòÉΓòÉΓòÉ
  2019.  
  2020.  /ignoreMsgSeg
  2021.  
  2022. Syntax: /ignoreMsgSeg 
  2023.  
  2024. WARNING: USE OF THIS OPTION WILL CAUSE PROCESSED CODE TO FAIL ON THE FIRST 
  2025. ATTEMPT TO RETRIEVE DosGetMessage DATA. 
  2026.  
  2027. Force LXOPT to ignore DosGetMessage data within application code.  This data 
  2028. bypasses normal fixup referencing and is incompatible with LXOPT processing. 
  2029.  
  2030. To avoid problems with DosGetMessage data refer to the instructions given with 
  2031. the LXO0169 error.  Only use the /ignoreMsgSeg option if you are unable to 
  2032. relink the exe/dll. 
  2033.  
  2034. The DosGetMessage data is detected by searching for a (0xFF,"_MSGSEG") byte 
  2035. sequence within the processed code.  This option should only be used where the 
  2036. detection is believed to be incorrect (BEWARE - DosGetMessage is often included 
  2037. and used by library code) or if it is known that code logic prevents any calls 
  2038. to DosGetMessage. 
  2039.  
  2040.  
  2041. ΓòÉΓòÉΓòÉ 7.1.18. /lxinfo  ΓòÉΓòÉΓòÉ
  2042.  
  2043.  /lxinfo
  2044.  
  2045. Syntax: /lxinfo:<path> 
  2046.  
  2047. Specify path name for information gathered from source. 
  2048.  
  2049. The default is to use the application name with a .LXI extension.  Use this 
  2050. option to place the file in another location. 
  2051.  
  2052. This option must be consistent across use of the /prep and /arrange options. 
  2053.  
  2054.  
  2055. ΓòÉΓòÉΓòÉ 7.1.19. /noreport  ΓòÉΓòÉΓòÉ
  2056.  
  2057.  /noreport
  2058.  
  2059. Syntax: /noreport 
  2060.  
  2061. Do not generate comparative report on old and new code arrangements. See the 
  2062. /report option for a description of report generation. 
  2063.  
  2064.  
  2065. ΓòÉΓòÉΓòÉ 7.1.20. /orig  ΓòÉΓòÉΓòÉ
  2066.  
  2067.  /orig
  2068.  
  2069. Syntax: /orig:<path> 
  2070.  
  2071. Specify path name to which the original application file should be renamed. If 
  2072. this file already exists it is deleted. 
  2073.  
  2074. Default is to use the application name with a .ORI extension. 
  2075.  
  2076. This option must be consistent across use of the /prep and /arrange options. 
  2077.  
  2078.  
  2079. ΓòÉΓòÉΓòÉ 7.1.21. /overwrite  ΓòÉΓòÉΓòÉ
  2080.  
  2081.  /overwrite
  2082.  
  2083. Syntax: /overwrite 
  2084.  
  2085. Disable test which checks that original EXE/DLL file has not been updated 
  2086. before overwriting it after a new code arrangement has been generated. 
  2087.  
  2088. During arrangement LXOPT will normally check that an application file has not 
  2089. changed since it was prepared.  If it has confirmation is sought that the file 
  2090. may be overwritten.  This option switches off that test and always overwrites 
  2091. the original file. 
  2092.  
  2093. This option is only relevant when used with the /arrange option. 
  2094.  
  2095.  
  2096. ΓòÉΓòÉΓòÉ 7.1.22. /pack2  ΓòÉΓòÉΓòÉ
  2097.  
  2098.  /pack2
  2099.  
  2100. Syntax: /pack2[:<reduction threshold% (default 15)>] (default auto) 
  2101.  
  2102. Force the use of executable file page compression as introduced with OS/2 WARP. 
  2103. Each page in the file is compressed and the reduction in size calculated.  If 
  2104. the percentage reduction is greater than 15% the compressed form of the page is 
  2105. used.  The threshold of 15% may be varied by providing the new threshold to be 
  2106. used as a numeric parameter.  FILES USING PAGE LEVEL COMPRESSION WILL NOT 
  2107. EXECUTE ON VERSIONS OF OS/2 PRIOR TO WARP. 
  2108.  
  2109. To preserve the operating system version compatibility of the existing software 
  2110. LXOPT will only use page compression if the file already contains compressed 
  2111. pages or if the /pack2 option is specified.  All pages in the file including 
  2112. those containing data and resources are candidates for compression. 
  2113.  
  2114. The use of /pack2:100 will remove all compression from the resulting 
  2115. executable. 
  2116.  
  2117.  
  2118. ΓòÉΓòÉΓòÉ 7.1.23. /preload  ΓòÉΓòÉΓòÉ
  2119.  
  2120.  /preload
  2121.  
  2122. Syntax: /preload 
  2123.  
  2124. Allow the produced EXE/DLL file to be used with the Preload Utility. This 
  2125. option should be used in combination with the /arrange option. 
  2126.  
  2127. Preloading raises important development and performance issues.  See the 
  2128. section on Preloading Code for a discussion of when and how to use files 
  2129. prepared with this option. 
  2130.  
  2131. Use of /preload causes LXOPT to intercept EXE/DLL initialisation and insert a 
  2132. small preloading code stub of approximately 200 bytes.  The resulting file may 
  2133. be used normally or preloaded using the Preload Utility.  Files with 16 bit 
  2134. initialisation entry points may be not be preloaded. 
  2135.  
  2136. The inserted code stub is activated by the Preload Utility when a request is 
  2137. made to preload the file. 
  2138.  
  2139.  
  2140. ΓòÉΓòÉΓòÉ 7.1.24. /prep  ΓòÉΓòÉΓòÉ
  2141.  
  2142.  /prep
  2143.  
  2144. Syntax: /prep (default) 
  2145.  
  2146. Prepare the given exe/dll for a recording session. Alternative is /arrange. 
  2147.  
  2148. For an explanation of the preparation process see Creating a Recording Version. 
  2149.  
  2150.  
  2151. ΓòÉΓòÉΓòÉ 7.1.25. /recfile  ΓòÉΓòÉΓòÉ
  2152.  
  2153.  /recfile
  2154.  
  2155. Syntax: /recfile:<path> 
  2156.  
  2157. Specify path name of recording file. If the file already exists when recording 
  2158. starts the new recording is appended. 
  2159.  
  2160. The path name is used exactly as entered.  A relative path name will be used to 
  2161. open/create the recording file if one is specified.  For example, 
  2162. /recfile:MYAPP.REC will create the recording file MYAPP.REC in the current 
  2163. directory of the executing program.  This can be useful if recording is to be 
  2164. performed on other machines 
  2165.  
  2166. The default is to use the full application path name with a .REC extension. 
  2167.  
  2168. Moving data from the recording buffer to the recording file can form a 
  2169. significant part of the overhead of the recording process.  Recording files 
  2170. should ideally be placed on the fastest available local drive. 
  2171.  
  2172. Certain applications and DLLs have more than one instance while running.  When 
  2173. multiple instances are detected the recording DLL creates a new recording file 
  2174. for each instance.  The name for this file is generated by appending the 
  2175. instance number separated by a dot to the normal recording file name.  Thus 3 
  2176. instances of a DLL during recording might create: 
  2177.  
  2178. MYDLL.REC
  2179. MYDLL.REC.2
  2180. MYDLL.REC.3
  2181.  
  2182. If recording onto a FAT based partition you will need to use a /recfile path 
  2183. without an extension to allow production of valid 8.3 filenames. 
  2184.  
  2185. When using the /arrange option only one recfile may be specified.  To use 
  2186. multiple files concatenate them into one file with the OS/2 COPY command and 
  2187. specify the result as the recording file (e.g. COPY C:\RECDIR\*.REC* 
  2188. COMBINED.REC).  File concatenation also allows multiple recordings to be 
  2189. created at different times or on different machines and then combined before 
  2190. use. 
  2191.  
  2192.  
  2193. ΓòÉΓòÉΓòÉ 7.1.26. /reckeep  ΓòÉΓòÉΓòÉ
  2194.  
  2195.  /reckeep
  2196.  
  2197. Syntax: /recKeep:<path> 
  2198.  
  2199. Specify path name to which the previously generated recording application 
  2200. should be renamed. If this file already exists it is deleted. 
  2201.  
  2202. When a new arrangement is created LXOPT keeps the recording version of the 
  2203. application to allow further recording if required. 
  2204.  
  2205. Valid only with the /arrange option, this option allows the user to specify the 
  2206. path name to which the recording version should be renamed. 
  2207.  
  2208. Default is to use application path name with a .PRP extension. 
  2209.  
  2210.  
  2211. ΓòÉΓòÉΓòÉ 7.1.27. /report  ΓòÉΓòÉΓòÉ
  2212.  
  2213.  /report
  2214.  
  2215. Syntax: /report (default) 
  2216.  
  2217. Show comparative page fault report using old and new arrangements. 
  2218.  
  2219. LXOPT can use the recording file to simulate program page fault behaviour under 
  2220. various available memory conditions.  This is used to provide a comparison 
  2221. between the old and new code arrangements. 
  2222.  
  2223. Note: LXOPT can only simulate code accesses. If data is stored within the code 
  2224. object page faults caused by references to it will not be simulated. 
  2225.  
  2226. While informative a report may take some time to calculate and may be disabled 
  2227. by the alternative /noreport option. 
  2228.  
  2229.  
  2230. ΓòÉΓòÉΓòÉ 7.1.28. /thread  ΓòÉΓòÉΓòÉ
  2231.  
  2232.  /thread
  2233.  
  2234. Syntax: /thread:<single | multi | async | crit> 
  2235.  
  2236. Specifies the how the target application uses threads.  This information is 
  2237. used to decide if or how the LXOPT recorder should protect itself from 
  2238. interruption.  Users need not use this option unless they experience 
  2239. performance problems while recording. 
  2240.  
  2241. single 
  2242. Target application is single threaded.  Recording code does not need to guard 
  2243. against interruption by another thread.  This involves the least overhead 
  2244. during recording and should be used whenever possible. 
  2245.  
  2246. multi 
  2247. Target application is multi-threaded but does not terminate/suspend threads 
  2248. asynchronously.  Recording code guards against interruption by another thread 
  2249. but assumes that no thread halts execution of another by use of 
  2250. DosKillThread(otherThread) or DosSuspendThread(otherThread).  This option 
  2251. carries a slightly greater overhead during recording than the 'single' option. 
  2252.  
  2253. async 
  2254. Target application is multi-threaded and may terminate/suspend threads 
  2255. asynchronously.  Recording code ensures that it is not halted inside critical 
  2256. instruction sequences.  This involves a higher overhead during recording but 
  2257. does not allow for multiple threads of differing priorities. 
  2258.  
  2259. crit (Default) 
  2260. Target application is multi-threaded, may terminate/suspend threads 
  2261. asynchronously and may vary thread priorities.  Recording code ensures that no 
  2262. thread can ever interrupt critical instruction sequences.  This involves a 
  2263. higher overhead during recording but is the safest option. 
  2264.  
  2265. Use the option with the least overhead that your application allows.  If you 
  2266. are unsure which option is correct for your application use 'crit'. If a thread 
  2267. safety level lower than required is used your application may lock-up, deadlock 
  2268. on semaphores or fail during recording. 
  2269.  
  2270. The /thread option takes effect only with the /prep option. 
  2271.  
  2272.  
  2273. ΓòÉΓòÉΓòÉ 7.2. Glossary  ΓòÉΓòÉΓòÉ
  2274.  
  2275.                                     Glossary
  2276.  
  2277.  
  2278. ΓòÉΓòÉΓòÉ 7.2.1. Binary Arrangement Algorithm  ΓòÉΓòÉΓòÉ
  2279.  
  2280.  Binary Arrangement Algorithm
  2281.  
  2282. An algorithm to calculate a new code layout based on code usage information 
  2283. obtained while recording. 
  2284.  
  2285. The binary arrangement algorithm is the default LXOPT arrangement algorithm. 
  2286.  
  2287. The recording history is used to generate a binary pattern with bits set 
  2288. corresponding to time of use in the executing application.  A pattern is 
  2289. created for each code block within the application.  Blocks are then grouped 
  2290. together based on similarity of these patterns.  For many applications the 
  2291. binary algorithm will produce the best results. 
  2292.  
  2293. Algorithms are chosen by use of the /alg option. 
  2294.  
  2295.  
  2296. ΓòÉΓòÉΓòÉ 7.2.2. Firstuse Arrangement Algorithm  ΓòÉΓòÉΓòÉ
  2297.  
  2298.  Firstuse Arrangement Algorithm
  2299.  
  2300. An algorithm to calculate a new code layout based on code usage information 
  2301. obtained while recording. 
  2302.  
  2303. The firstuse algorithm arranges code on disk in the order in which it is first 
  2304. executed. This is a simple but effective algorithm which is best used on small 
  2305. applications and those with a simple flow of control. 
  2306.  
  2307. Algorithms are chosen by use of the /alg option. 
  2308.  
  2309.  
  2310. ΓòÉΓòÉΓòÉ 7.2.3. Fixup  ΓòÉΓòÉΓòÉ
  2311.  
  2312.  Fixup
  2313.  
  2314. When an application is loaded any absolute references to other parts of the 
  2315. application and all external references such as calls to the operating system 
  2316. must be resolved. 
  2317.  
  2318. For this to be achieved information must be retained in the exe/dll file 
  2319. describing the references which need to be 'fixed'.  This information, known as 
  2320. 'relocations' or 'fixups', allows code to be located at a position in memory 
  2321. chosen by the operating system.  Fixups are automatically applied as each code 
  2322. (or data) page is loaded from the executable file. 
  2323.  
  2324.  
  2325. ΓòÉΓòÉΓòÉ 7.2.4. Page Fault  ΓòÉΓòÉΓòÉ
  2326.  
  2327.  Page Fault
  2328.  
  2329. All code for normal applications is divided into 4Kb pages.  A page fault is 
  2330. generated when an attempt is made to reference an address within a page that is 
  2331. not already in memory (*). 
  2332.  
  2333. When a page fault is generated OS/2 must load the page from disk, apply fixups 
  2334. to the page and return control to the application.  All application code is 
  2335. loaded via page faults.  When an application is started OS/2 does not 
  2336. immediately read any application code from the disk (**).  Code is loaded into 
  2337. memory only as a result of page faults generated as the path of execution 
  2338. strays on to each new page.  Execution of the errant thread is suspended until 
  2339. the page is loaded and available for use.  It is this effect which often causes 
  2340. the system to appear slow or 'jerky', most noticeably at application start-up 
  2341. or after the use of a large memory hungry application. 
  2342.  
  2343. The problem is compounded in low memory conditions where OS/2 is forced to 
  2344. release the contents of one memory page to provide space for another.  If the 
  2345. original page is later referenced it must be reloaded, again taking space from 
  2346. another.  Servicing page faults can represent a significant overhead for both 
  2347. your application and the system as a whole. 
  2348.  
  2349. LXOPT optimises your code layout to minimise the number of page faults required 
  2350. to run your application. 
  2351.  
  2352. * Not all page faults result in a disk access.  OS/2 will mark pages 'not 
  2353. present' and use resulting page faults to detect page references.  This 
  2354. mechanism helps to prevent repeatedly accessed pages being removed from memory. 
  2355. These 'artificial' page faults have only a small CPU impact, the page is found 
  2356. in memory and will not be read from disk. 
  2357.  
  2358. ** OS/2 V2.0 and later ignore EXE/DLL preload pages created by use of the 
  2359. PRELOAD keyword used in module definition files. 
  2360.  
  2361.  
  2362. ΓòÉΓòÉΓòÉ 7.2.5. Parked Code  ΓòÉΓòÉΓòÉ
  2363.  
  2364.  Parked Code
  2365.  
  2366. Code that is logically reachable but is not normally executed by your 
  2367. application.  Such code is detected by LXOPT and placed or 'parked' in your 
  2368. applications executable file on code pages where it causes least overhead. 
  2369.  
  2370. See Creating Optimised Code Arrangement for more details. 
  2371.  
  2372.  
  2373. ΓòÉΓòÉΓòÉ 7.2.6. ParkOnly Arrangement Algorithm  ΓòÉΓòÉΓòÉ
  2374.  
  2375.  ParkOnly Arrangement Algorithm
  2376.  
  2377. An algorithm to calculate a new code layout based on code usage information 
  2378. obtained while recording. 
  2379.  
  2380. The parkonly arrangement algorithm does not attempt to perform any code 
  2381. arrangement other than parking any unused code. 
  2382.  
  2383. This algorithm is intended to allow developers with special code arrangement 
  2384. needs to retain control over the arrangement of executed code while still 
  2385. gaining the benefit of code parking.  This algorithm is not intended for normal 
  2386. use and should only be chosen by developers who have created manual code 
  2387. layouts to match their special requirements. 
  2388.  
  2389. Algorithms are chosen by use of the /alg option. 
  2390.  
  2391.  
  2392. ΓòÉΓòÉΓòÉ 7.2.7. Recording File  ΓòÉΓòÉΓòÉ
  2393.  
  2394.  Recording File
  2395.  
  2396. A file generated during the recording phase of LXOPT usage.  This file is 
  2397. created and expanded as your application runs, recording the paths of execution 
  2398. through your code. 
  2399.  
  2400. See /recfile for more information and how to specify the recording file path. 
  2401.  
  2402.  
  2403. ΓòÉΓòÉΓòÉ 7.2.8. Sleeping Code  ΓòÉΓòÉΓòÉ
  2404.  
  2405.  Sleeping Code
  2406.  
  2407. Code not normally executed by your application.  Such code is typically used to 
  2408. handle unusual situations not encountered by your application during recording. 
  2409. This code may also be logically unreachable. 
  2410.  
  2411. LXOPT can place such code in your applications executable file in a location 
  2412. where it causes the least overhead while remaining accessible. 
  2413.  
  2414. See Creating Optimised Code Arrangement for more details. 
  2415.  
  2416.  
  2417. ΓòÉΓòÉΓòÉ 7.2.9. Statistical Arrangement Algorithm  ΓòÉΓòÉΓòÉ
  2418.  
  2419.  Statistical Arrangement Algorithm
  2420.  
  2421. An algorithm to calculate a new code layout based on code usage information 
  2422. obtained while recording. 
  2423.  
  2424. The stat algorithm uses statistics to detect the pattern of use of each code 
  2425. sequence throughout the life of the application. Code sequences are grouped by 
  2426. this pattern and then arranged within the group based on the most frequently 
  2427. used ordering.  The optimum number of groups into which to split the code is 
  2428. dependant on your application and is specified with the /groups option. 
  2429. Experiment with this option using different group values to find the optimum 
  2430. value for your application.  This is typically between 1 and 20. 
  2431.  
  2432. Performance of the stat algorithm is degraded when using high values for the 
  2433. /compress option. 
  2434.  
  2435. The stat algorithm is best suited to large applications or those with a complex 
  2436. flow of control. Experiment with values for the /groups option to achieve the 
  2437. best results. 
  2438.  
  2439. Algorithms are chosen by use of the /alg option. 
  2440.  
  2441.  
  2442. ΓòÉΓòÉΓòÉ 7.3. Program Messages  ΓòÉΓòÉΓòÉ
  2443.  
  2444.                                 Program Messages
  2445.  
  2446.  
  2447. ΓòÉΓòÉΓòÉ 7.3.1. Internal Errors  ΓòÉΓòÉΓòÉ
  2448.  
  2449.  Internal Errors
  2450.  
  2451. The LXOPT software performs numerous internal consistency checks during its 
  2452. operation.  If one of these tests should fail an internal error is produced. 
  2453.  
  2454. If you have not read the restrictions section please do so now.  If you are not 
  2455. violating a restriction or are unsure please report the internal error using a 
  2456. Customer Report Form. 
  2457.  
  2458.  
  2459. ΓòÉΓòÉΓòÉ 7.3.2. LXO0100  ΓòÉΓòÉΓòÉ
  2460.  
  2461.  LXO0100
  2462.  
  2463. Failed to expand program fixup records. 
  2464.  
  2465. LXOPT failed to expand the applications fixup records.  Please ensure the 
  2466. application file has not been corrupted.  If the application has not been 
  2467. corrupted please report this error using a Customer Report Form. 
  2468.  
  2469.  
  2470. ΓòÉΓòÉΓòÉ 7.3.3. LXO0101  ΓòÉΓòÉΓòÉ
  2471.  
  2472.  LXO0101
  2473.  
  2474. Unable to create dump file. 
  2475.  
  2476. Dump files are used for debugging purposes and are created with the name "dump" 
  2477. in the current directory of the application. 
  2478.  
  2479.  
  2480. ΓòÉΓòÉΓòÉ 7.3.4. LXO0102  ΓòÉΓòÉΓòÉ
  2481.  
  2482.  LXO0102
  2483.  
  2484. Unable to pursue code instruction sequence. 
  2485.  
  2486. LXOPT was unable to pursue a sequence of bytes which it assumed to be code. 
  2487. This may be caused by exporting data from your applications code segment or by 
  2488. an internal error in LXOPT. 
  2489.  
  2490. To rectify export problems move any exported data to a separate object. 
  2491.  
  2492. To rectify code recognition problems move read-only application data out of 
  2493. your code object to a read-only data object. 
  2494.  
  2495. If the problem persists please report this error using a Customer Report Form. 
  2496.  
  2497.  
  2498. ΓòÉΓòÉΓòÉ 7.3.5. LXO0103  ΓòÉΓòÉΓòÉ
  2499.  
  2500.  LXO0103
  2501.  
  2502. Preparation of new code arrangement failed. 
  2503.  
  2504. An error occurred preparing the structures for the new application. Please 
  2505. ensure your original application file is valid.  If so please report this error 
  2506. using a Customer Report Form. 
  2507.  
  2508.  
  2509. ΓòÉΓòÉΓòÉ 7.3.6. LXO0104  ΓòÉΓòÉΓòÉ
  2510.  
  2511.  LXO0104
  2512.  
  2513. Failed to create/write LXI file. 
  2514.  
  2515. A disk error occurred creating or writing the .LXI file.  Check that sufficient 
  2516. disk space is available and usage of the /lxinfo option. 
  2517.  
  2518.  
  2519. ΓòÉΓòÉΓòÉ 7.3.7. LXO0105  ΓòÉΓòÉΓòÉ
  2520.  
  2521.  LXO0105
  2522.  
  2523. Cannot copy program to "pathname" 
  2524.  
  2525. Failed to copy the original application file.  Check that the /orig option 
  2526. parameter.  If the file is a DLL check that it is not currently loaded by 
  2527. another application. 
  2528.  
  2529.  
  2530. ΓòÉΓòÉΓòÉ 7.3.8. LXO0106  ΓòÉΓòÉΓòÉ
  2531.  
  2532.  LXO0106
  2533.  
  2534. Cannot create file "pathname" 
  2535.  
  2536. Failed to create the given file.  Check the path is valid, there is sufficient 
  2537. free disk space, the file is not in use and the required access rights to the 
  2538. target directory are available. 
  2539.  
  2540.  
  2541. ΓòÉΓòÉΓòÉ 7.3.9. LXO0107  ΓòÉΓòÉΓòÉ
  2542.  
  2543.  LXO0107
  2544.  
  2545. Failed to write new program file. 
  2546.  
  2547. A failure occurred while writing the new executable.  Check disk space. 
  2548.  
  2549.  
  2550. ΓòÉΓòÉΓòÉ 7.3.10. LXO0108  ΓòÉΓòÉΓòÉ
  2551.  
  2552.  LXO0108
  2553.  
  2554. Failed to read LXI file "pathname" 
  2555.  
  2556. The LXI file could not be read or is invalid.  Check use of the /lxinfo option. 
  2557.  
  2558.  
  2559. ΓòÉΓòÉΓòÉ 7.3.11. LXO0109  ΓòÉΓòÉΓòÉ
  2560.  
  2561.  LXO0109
  2562.  
  2563. Invalid parameter or value for option: "option". 
  2564.  
  2565. The option or its parameter given to LXOPT was not recognised. 
  2566.  
  2567.  
  2568. ΓòÉΓòÉΓòÉ 7.3.12. LXO0110  ΓòÉΓòÉΓòÉ
  2569.  
  2570.  LXO0110
  2571.  
  2572. Failed to open "pathname" 
  2573.  
  2574. Could not open the given file.  Check that the pathname is valid, the file 
  2575. exists and you have sufficient access rights to its directory. 
  2576.  
  2577.  
  2578. ΓòÉΓòÉΓòÉ 7.3.13. LXO0111  ΓòÉΓòÉΓòÉ
  2579.  
  2580.  LXO0111
  2581.  
  2582. File "pathname" is not a valid linear executable 
  2583.  
  2584. Could not load the specified file.  The file is corrupt or is not an OS/2 
  2585. 2.x/WARP Linear eXecutable file. 
  2586.  
  2587.  
  2588. ΓòÉΓòÉΓòÉ 7.3.14. LXO0112  ΓòÉΓòÉΓòÉ
  2589.  
  2590.  LXO0112
  2591.  
  2592. See Internal Errors 
  2593.  
  2594.  
  2595. ΓòÉΓòÉΓòÉ 7.3.15. LXO0113  ΓòÉΓòÉΓòÉ
  2596.  
  2597.  LXO0113
  2598.  
  2599. Input offset is out of range. 
  2600.  
  2601. The supplied offset does not exist.  This message appears if an incorrect 
  2602. parameter is used with the /getOld or /getNew options.  Check that the value 
  2603. given is the offset in hex from the start of the processed code object. 
  2604.  
  2605. If this message appears during LXOPT preparation or arrangement this is an 
  2606. Internal Error. 
  2607.  
  2608.  
  2609. ΓòÉΓòÉΓòÉ 7.3.16. LXO0114  ΓòÉΓòÉΓòÉ
  2610.  
  2611.  LXO0114
  2612.  
  2613. See LXO0113 
  2614.  
  2615.  
  2616. ΓòÉΓòÉΓòÉ 7.3.17. LXO0115  ΓòÉΓòÉΓòÉ
  2617.  
  2618.  LXO0115
  2619.  
  2620. See LXO0113 
  2621.  
  2622.  
  2623. ΓòÉΓòÉΓòÉ 7.3.18. LXO0116  ΓòÉΓòÉΓòÉ
  2624.  
  2625.  LXO0116
  2626.  
  2627. See Internal Errors 
  2628.  
  2629. Although an internal error, this message has only previously occurred where a 
  2630. user is not following the advice in the Urgent Message section.  This is 
  2631. important advice, do not ignore it. 
  2632.  
  2633.  
  2634. ΓòÉΓòÉΓòÉ 7.3.19. LXO0117  ΓòÉΓòÉΓòÉ
  2635.  
  2636.  LXO0117
  2637.  
  2638. See Internal Errors 
  2639.  
  2640.  
  2641. ΓòÉΓòÉΓòÉ 7.3.20. LXO0118  ΓòÉΓòÉΓòÉ
  2642.  
  2643.  LXO0118
  2644.  
  2645. See Internal Errors 
  2646.  
  2647.  
  2648. ΓòÉΓòÉΓòÉ 7.3.21. LXO0119  ΓòÉΓòÉΓòÉ
  2649.  
  2650.  LXO0119
  2651.  
  2652. See Internal Errors 
  2653.  
  2654.  
  2655. ΓòÉΓòÉΓòÉ 7.3.22. LXO0120  ΓòÉΓòÉΓòÉ
  2656.  
  2657.  LXO0120
  2658.  
  2659. Information (.LXI) file was not created by this version of LXOPT. 
  2660.  
  2661. The LXI file you have attempted to use was created by another version of LXOPT. 
  2662.  
  2663. Applications must be prepared and arranged using the same version of LXOPT. 
  2664. Prepare and generate new recording information for the application using the 
  2665. current version of the LXOPT software. 
  2666.  
  2667.  
  2668. ΓòÉΓòÉΓòÉ 7.3.23. LXO0121  ΓòÉΓòÉΓòÉ
  2669.  
  2670.  LXO0121
  2671.  
  2672.  Recording (.REC) file does not belong to the processed application. 
  2673.  
  2674. Your recording file was not made by the application being processed. 
  2675.  
  2676. Check that you are attempting to arrange the correct application and that you 
  2677. are not using a recording file intended for an earlier version or a different 
  2678. application. 
  2679.  
  2680. See also the /recfile option. 
  2681.  
  2682.  
  2683. ΓòÉΓòÉΓòÉ 7.3.24. LXO0122  ΓòÉΓòÉΓòÉ
  2684.  
  2685.  LXO0122
  2686.  
  2687.  .REC file is not valid. 
  2688.  
  2689. The given recording file has been corrupted or is not a recording file. Check 
  2690. use of the /recfile option parameter. 
  2691.  
  2692.  
  2693. ΓòÉΓòÉΓòÉ 7.3.25. LXO0123  ΓòÉΓòÉΓòÉ
  2694.  
  2695.  LXO0123
  2696.  
  2697. Unrecognised arrangement algorithm "alg-name" 
  2698.  
  2699. The given arrangement algorithm name is not recognised. See the /alg option for 
  2700. more details. 
  2701.  
  2702.  
  2703. ΓòÉΓòÉΓòÉ 7.3.26. LXO0124  ΓòÉΓòÉΓòÉ
  2704.  
  2705.  LXO0124
  2706.  
  2707. See Internal Errors 
  2708.  
  2709.  
  2710. ΓòÉΓòÉΓòÉ 7.3.27. LXO0125  ΓòÉΓòÉΓòÉ
  2711.  
  2712.  LXO0125
  2713.  
  2714. See Internal Errors 
  2715.  
  2716.  
  2717. ΓòÉΓòÉΓòÉ 7.3.28. LXO0126  ΓòÉΓòÉΓòÉ
  2718.  
  2719.  LXO0126
  2720.  
  2721. See Internal Errors 
  2722.  
  2723.  
  2724. ΓòÉΓòÉΓòÉ 7.3.29. LXO0127  ΓòÉΓòÉΓòÉ
  2725.  
  2726.  LXO0127
  2727.  
  2728. See Internal Errors 
  2729.  
  2730.  
  2731. ΓòÉΓòÉΓòÉ 7.3.30. LXO0128  ΓòÉΓòÉΓòÉ
  2732.  
  2733.  LXO0128
  2734.  
  2735. See Internal Errors 
  2736.  
  2737.  
  2738. ΓòÉΓòÉΓòÉ 7.3.31. LXO0129  ΓòÉΓòÉΓòÉ
  2739.  
  2740.  LXO0129
  2741.  
  2742. See Internal Errors 
  2743.  
  2744.  
  2745. ΓòÉΓòÉΓòÉ 7.3.32. LXO0130  ΓòÉΓòÉΓòÉ
  2746.  
  2747.  LXO0130
  2748.  
  2749. See Internal Errors 
  2750.  
  2751.  
  2752. ΓòÉΓòÉΓòÉ 7.3.33. LXO0131  ΓòÉΓòÉΓòÉ
  2753.  
  2754.  LXO0131
  2755.  
  2756. See Internal Errors 
  2757.  
  2758.  
  2759. ΓòÉΓòÉΓòÉ 7.3.34. LXO0132  ΓòÉΓòÉΓòÉ
  2760.  
  2761.  LXO0132
  2762.  
  2763. See Internal Errors 
  2764.  
  2765.  
  2766. ΓòÉΓòÉΓòÉ 7.3.35. LXO0133  ΓòÉΓòÉΓòÉ
  2767.  
  2768.  LXO0133
  2769.  
  2770. See Internal Errors 
  2771.  
  2772.  
  2773. ΓòÉΓòÉΓòÉ 7.3.36. LXO0134  ΓòÉΓòÉΓòÉ
  2774.  
  2775.  LXO0134
  2776.  
  2777. See Internal Errors 
  2778.  
  2779.  
  2780. ΓòÉΓòÉΓòÉ 7.3.37. LXO0135  ΓòÉΓòÉΓòÉ
  2781.  
  2782.  LXO0135
  2783.  
  2784. See Internal Errors 
  2785.  
  2786.  
  2787. ΓòÉΓòÉΓòÉ 7.3.38. LXO0136  ΓòÉΓòÉΓòÉ
  2788.  
  2789.  LXO0136
  2790.  
  2791. See Internal Errors 
  2792.  
  2793.  
  2794. ΓòÉΓòÉΓòÉ 7.3.39. LXO0137  ΓòÉΓòÉΓòÉ
  2795.  
  2796.  LXO0137
  2797.  
  2798. See Internal Errors 
  2799.  
  2800.  
  2801. ΓòÉΓòÉΓòÉ 7.3.40. LXO0138  ΓòÉΓòÉΓòÉ
  2802.  
  2803.  LXO0138
  2804.  
  2805.  Code object exports a 286 call gate entry point. 
  2806.  
  2807. LXOPT has detected an exported 16 bit call gate entry which refers to the 32 
  2808. bit code object which is being processed.  It is likely that when control is 
  2809. received via this entry point that some 16 bit selectors will be in effect. 
  2810. LXOPT is designed to be applied to 32 bit code.  You cannot export 16 bit call 
  2811. gate entry points from the processed 32 bit code object. 
  2812.  
  2813.  
  2814. ΓòÉΓòÉΓòÉ 7.3.41. LXO0139  ΓòÉΓòÉΓòÉ
  2815.  
  2816.  LXO0139
  2817.  
  2818. See Internal Errors 
  2819.  
  2820.  
  2821. ΓòÉΓòÉΓòÉ 7.3.42. LXO0140  ΓòÉΓòÉΓòÉ
  2822.  
  2823.  LXO0140
  2824.  
  2825. See Internal Errors 
  2826.  
  2827.  
  2828. ΓòÉΓòÉΓòÉ 7.3.43. LXO0141  ΓòÉΓòÉΓòÉ
  2829.  
  2830.  LXO0141
  2831.  
  2832. See Internal Errors 
  2833.  
  2834.  
  2835. ΓòÉΓòÉΓòÉ 7.3.44. LXO0142  ΓòÉΓòÉΓòÉ
  2836.  
  2837.  LXO0142
  2838.  
  2839. See Internal Errors 
  2840.  
  2841.  
  2842. ΓòÉΓòÉΓòÉ 7.3.45. LXO0143  ΓòÉΓòÉΓòÉ
  2843.  
  2844.  LXO0143
  2845.  
  2846. See Internal Errors 
  2847.  
  2848.  
  2849. ΓòÉΓòÉΓòÉ 7.3.46. LXO0144  ΓòÉΓòÉΓòÉ
  2850.  
  2851.  LXO0144
  2852.  
  2853. See Internal Errors 
  2854.  
  2855.  
  2856. ΓòÉΓòÉΓòÉ 7.3.47. LXO0145  ΓòÉΓòÉΓòÉ
  2857.  
  2858.  LXO0145
  2859.  
  2860. See Internal Errors 
  2861.  
  2862.  
  2863. ΓòÉΓòÉΓòÉ 7.3.48. LXO0146  ΓòÉΓòÉΓòÉ
  2864.  
  2865.  LXO0146
  2866.  
  2867. Out of memory. 
  2868.  
  2869. LXOPT ran out of memory while processing the application.  Up to approximately 
  2870. 15 times the size of the application code size will need to be allocated for 
  2871. processing to succeed.  Check that there is sufficient free disk space on your 
  2872. swap partition. 
  2873.  
  2874.  
  2875. ΓòÉΓòÉΓòÉ 7.3.49. LXO0147  ΓòÉΓòÉΓòÉ
  2876.  
  2877.  LXO0147
  2878.  
  2879. Failed to follow code pointer. 
  2880.  
  2881. See LXO0102 
  2882.  
  2883.  
  2884. ΓòÉΓòÉΓòÉ 7.3.50. LXO0148  ΓòÉΓòÉΓòÉ
  2885.  
  2886.  LXO0148
  2887.  
  2888. No objects in program module. 
  2889.  
  2890. The processed application does not contain any code. 
  2891.  
  2892.  
  2893. ΓòÉΓòÉΓòÉ 7.3.51. LXO0149  ΓòÉΓòÉΓòÉ
  2894.  
  2895.  LXO0149
  2896.  
  2897. No pages in program module. 
  2898.  
  2899. The processed application does not contain any code. 
  2900.  
  2901.  
  2902. ΓòÉΓòÉΓòÉ 7.3.52. LXO0150  ΓòÉΓòÉΓòÉ
  2903.  
  2904.  LXO0150
  2905.  
  2906. Unused area "start address" to "end address" contains fixups. 
  2907.  
  2908. The bytes between the start and end offsets have been detected as unused. 
  2909. However they represent either valid code or initialised data. 
  2910.  
  2911. This warning will appear for almost all applications processed and demonstrates 
  2912. LXOPT's effectiveness at finding unused code or data.  Often such code is 
  2913. contained in libraries to which your application is linked.  Offsets are 
  2914. relative to the start of the processed code object.  Unused code or data is not 
  2915. referenced by any part of the application and is removed by LXOPT 
  2916.  
  2917. If your application contains assembler code that you suspect might be violating 
  2918. LXOPT restrictions you can use the address range and your map file to identify 
  2919. the source code. 
  2920.  
  2921.  
  2922. ΓòÉΓòÉΓòÉ 7.3.53. LXO0151  ΓòÉΓòÉΓòÉ
  2923.  
  2924.  LXO0151
  2925.  
  2926. Code object "object-number" is writeable. 
  2927.  
  2928. The given code object is writeable.  Although LXOPT can still process the 
  2929. application writeable code objects can indicate that programming techniques 
  2930. that violate LXOPT restrictions may be in use. This is particularly true if the 
  2931. object named is the one being processed. 
  2932.  
  2933.  
  2934. ΓòÉΓòÉΓòÉ 7.3.54. LXO0152  ΓòÉΓòÉΓòÉ
  2935.  
  2936.  LXO0152
  2937.  
  2938. See Internal Errors 
  2939.  
  2940.  
  2941. ΓòÉΓòÉΓòÉ 7.3.55. LXO0153  ΓòÉΓòÉΓòÉ
  2942.  
  2943.  LXO0153
  2944.  
  2945. See Internal Errors 
  2946.  
  2947.  
  2948. ΓòÉΓòÉΓòÉ 7.3.56. LXO0154  ΓòÉΓòÉΓòÉ
  2949.  
  2950.  LXO0154
  2951.  
  2952. Base not multiple of 64Kb.  The specified new program base is not a multiple of 
  2953. 64Kb.  This warning normally appears when the new base has been incorrectly 
  2954. specified.  Base values are entered as an address in hex. 
  2955.  
  2956. See the /base option for correct usage. 
  2957.  
  2958.  
  2959. ΓòÉΓòÉΓòÉ 7.3.57. LXO0155  ΓòÉΓòÉΓòÉ
  2960.  
  2961.  LXO0155
  2962.  
  2963. Module is not standard EXE or DLL. 
  2964.  
  2965. The application file is of a type not processed by LXOPT.  Typically this 
  2966. message is produced by an attempt to apply LXOPT to a physical or virtual 
  2967. device driver. 
  2968.  
  2969.  
  2970. ΓòÉΓòÉΓòÉ 7.3.58. LXO0156  ΓòÉΓòÉΓòÉ
  2971.  
  2972.  LXO0156
  2973.  
  2974. See Internal Errors 
  2975.  
  2976.  
  2977. ΓòÉΓòÉΓòÉ 7.3.59. LXO0157  ΓòÉΓòÉΓòÉ
  2978.  
  2979.  LXO0157
  2980.  
  2981. Internal fixups have been removed. 
  2982.  
  2983. The EXE file has been given a base address.  Applying a base address when 
  2984. linking strips internal fixups from EXE files.  LXOPT needs internal fixups to 
  2985. enable it to correctly process your application. 
  2986.  
  2987. See Preparing Applications for more information. 
  2988.  
  2989.  
  2990. ΓòÉΓòÉΓòÉ 7.3.60. LXO0158  ΓòÉΓòÉΓòÉ
  2991.  
  2992.  LXO0158
  2993.  
  2994. File contains an unknown page type. 
  2995.  
  2996. The processed file contains code/data encoded in a manner unknown to LXOPT or 
  2997. OS/2 V2.1.  This is probably due to the use of a new linker or other 
  2998. development tool. 
  2999.  
  3000. To rectify the problem choose options with the new linker/tool that will allow 
  3001. the resulting application to run under OS/2 V2.x or WARP.  Check also that you 
  3002. are using the latest available version of LXOPT. 
  3003.  
  3004.  
  3005. ΓòÉΓòÉΓòÉ 7.3.61. LXO0159  ΓòÉΓòÉΓòÉ
  3006.  
  3007.  LXO0159
  3008.  
  3009. Failed to decompress EXEPACK2 page, file corrupted?. 
  3010.  
  3011. The processed file contains code or data identified as compressed using the 
  3012. technique introduced by OS/2 V3.0 (Warp).  A compressed page did not expand 
  3013. correctly. 
  3014.  
  3015. It is likely that the file is corrupted.  Please regenerate any files created 
  3016. via the resource compiler -X2 option and relink the application.  If this does 
  3017. not correct the problem please report this to LXOPT technical support. 
  3018.  
  3019.  
  3020. ΓòÉΓòÉΓòÉ 7.3.62. LXO0160  ΓòÉΓòÉΓòÉ
  3021.  
  3022.  LXO0160
  3023.  
  3024.  Information (.LXI) file does not belong to the processed application. 
  3025.  
  3026. Your information file was not made by the application being processed. 
  3027.  
  3028. Check that you are attempting to arrange the correct application and that you 
  3029. are not using an information file intended for an earlier version or a 
  3030. different application. 
  3031.  
  3032. See also the /lxinfo option. 
  3033.  
  3034.  
  3035. ΓòÉΓòÉΓòÉ 7.3.63. LXO0161  ΓòÉΓòÉΓòÉ
  3036.  
  3037.  LXO0161
  3038.  
  3039.  The preload option or LXOPT demo version cannot process files with 16 bit 
  3040. library initialisation code. 
  3041.  
  3042. The /preload option and the LXOPT demo both need to alter library 
  3043. initialisation to operate correctly. Your DLL contains a 16 bit entry point and 
  3044. LXOPT is unable to process the initialisation sequence. 
  3045.  
  3046. The full product will process such DLLs (without /preload) although a 16 bit 
  3047. main entry point indicates that the restrictions section will need to be read 
  3048. with particular notice to the section on SS:ESP. 
  3049.  
  3050.  
  3051. ΓòÉΓòÉΓòÉ 7.3.64. LXO0162  ΓòÉΓòÉΓòÉ
  3052.  
  3053.  LXO0162
  3054.  
  3055.  No recorder dll name available. 
  3056.  
  3057. LXOPT has failed to generate a unique name for your application specific 
  3058. recording DLL. 
  3059.  
  3060. It is likely that over a period of time a large number of unused recording DLLs 
  3061. has built up in your development directory.  Delete all old versions and 
  3062. reattempt preparation. 
  3063.  
  3064.  
  3065. ΓòÉΓòÉΓòÉ 7.3.65. LXO0163  ΓòÉΓòÉΓòÉ
  3066.  
  3067.  LXO0163
  3068.  
  3069.  Cannot locate LXOPT recorder data.  Check your PATH and installation. 
  3070.  
  3071. LXOPT failed to find its installation directory where vital data is stored. 
  3072.  
  3073. Please ensure that the LXOPT installation directory is on your PATH and that 
  3074. installation completed successfully. 
  3075.  
  3076.  
  3077. ΓòÉΓòÉΓòÉ 7.3.66. LXO0164  ΓòÉΓòÉΓòÉ
  3078.  
  3079.  LXO0164
  3080.  
  3081.  Disk access failure creating recorder DLL. 
  3082.  
  3083. Creation of a recorder DLL failed due to a file access failure. 
  3084.  
  3085. Check that you have enough available disk space and that you have sufficient 
  3086. access rights if the target directory is on a network.  Check also that an 
  3087. existing recording DLL is not in use. 
  3088.  
  3089.  
  3090. ΓòÉΓòÉΓòÉ 7.3.67. LXO0165  ΓòÉΓòÉΓòÉ
  3091.  
  3092.  LXO0165
  3093.  
  3094. See Internal Errors 
  3095.  
  3096.  
  3097. ΓòÉΓòÉΓòÉ 7.3.68. LXO0166  ΓòÉΓòÉΓòÉ
  3098.  
  3099.  LXO0166
  3100.  
  3101.  High number of layout attempts: <N>, continuing... 
  3102.  
  3103. LXOPT is having difficulty recreating your EXE/DLL. 
  3104.  
  3105. Some large applications make take a significant number of attempts before a 
  3106. successful layout can be achieved.  LXOPT should always eventually succeed but 
  3107. if LXOPT does not complete and you receive several of these messages please 
  3108. contact technical support. 
  3109.  
  3110.  
  3111. ΓòÉΓòÉΓòÉ 7.3.69. LXO0167  ΓòÉΓòÉΓòÉ
  3112.  
  3113.  LXO0167
  3114.  
  3115. Cannot copy prepared recording program to "pathname" 
  3116.  
  3117. Failed to copy the prepared application file.  Check disk space or 
  3118. file/directory access permissions. 
  3119.  
  3120.  
  3121. ΓòÉΓòÉΓòÉ 7.3.70. LXO0168  ΓòÉΓòÉΓòÉ
  3122.  
  3123.  LXO0168
  3124.  
  3125. See Internal Errors 
  3126.  
  3127.  
  3128. ΓòÉΓòÉΓòÉ 7.3.71. LXO0169  ΓòÉΓòÉΓòÉ
  3129.  
  3130.  LXO0169
  3131.  
  3132. Active DosGetMessage data (MSGSEG32) detected in code area. 
  3133.  
  3134. Some message data used by DosGetMessage is contained within the code object 
  3135. processed by LXOPT.  This message data is retrieved during execution of 
  3136. DosGetMessage code using the address of the containing code object and adding a 
  3137. predetermined offset to it.  This mechanism bypasses normal code/data 
  3138. referencing and is incompatible with LXOPT processing. 
  3139.  
  3140. This data is often introduced by use of functions within the IBM CSet/VAC 
  3141. libraries which in turn depend on DosGetMessage for their own message handling. 
  3142.  
  3143. To prevent this problem move the message data to another code object by 
  3144. identifying the 'segment' in your module definition (.DEF) file.  If the 
  3145. processed file was an executable which does not currently have a .DEF file, 
  3146. create a file <exe-name>.DEF and insert the lines below.  Remember to include 
  3147. your definition file when you relink. 
  3148.  
  3149. NAME <exe-name> <WINDOWAPI | WINDOWCOMPAT | NOTWINOWCOMPAT>
  3150.  
  3151. SEGMENTS
  3152.   _MSGSEG32 CLASS 'CODE'
  3153.  
  3154. For existing .DEF files simply add the line containing _MSGSEG32 to the 
  3155. SEGMENTS section. 
  3156.  
  3157. MSGSEG32 data is detected by searching for data which starts with a 0xFF byte 
  3158. followed by the text MSGSEG32.  In the unlikely event that your code contains 
  3159. this data sequence for another purpose or you are SURE that it is not used this 
  3160. LXOPT test may be disabled, see the /ignoreMsgSeg option for more details. 
  3161.  
  3162.  
  3163. ΓòÉΓòÉΓòÉ 8. Utilities  ΓòÉΓòÉΓòÉ
  3164.  
  3165.                                     Utilities
  3166.  
  3167.  
  3168. ΓòÉΓòÉΓòÉ 8.1. LXWarp - Apply OS/2 WARP compression to 2.x executables  ΓòÉΓòÉΓòÉ
  3169.  
  3170.  LXWarp - Apply OS/2 WARP compression to 2.x executables
  3171.  
  3172. Usage: LXWARP <filename> [/clear] [/bakfile:<backup_pathname>] 
  3173. [/threshold:<reduction_threshold>] 
  3174.  
  3175.  Examples: 
  3176.  
  3177.    LXWARP myapp.dll /clear                        Compress 'myapp.dll' and 
  3178.                                                   delete the backup file on 
  3179.                                                   successful completion. 
  3180.  
  3181.    LXWARP myapp.dll /threshold:20                 Compress 'myapp.dll' pages 
  3182.                                                   where compression reduces the 
  3183.                                                   page size by more than 20%. 
  3184.                                                   Original file stored as 
  3185.                                                   'myapp.wbk'. 
  3186.  
  3187.  LXWARP takes an existing executable and applies OS/2 WARP page compression to 
  3188.  it.  The EXE/DLL file created will occupy less disk space and take less time 
  3189.  to be loaded by the operating system. This new file will not execute under 
  3190.  versions of OS/2 prior to WARP. 
  3191.  
  3192.  LXWARP allows OS/2 WARP users of 2.x targeted code to gain the benefits of 
  3193.  page level compression.  Developers may also use LXWARP to process third party 
  3194.  2.x targeted DLLs for use with their OS/2 WARP specific applications. 
  3195.  
  3196.  LXWARP is not included in the demonstration version of LXOPT. 
  3197.  
  3198.  
  3199. ΓòÉΓòÉΓòÉ 8.1.1. /clear  ΓòÉΓòÉΓòÉ
  3200.  
  3201.  /clear
  3202.  
  3203. Syntax: /clear (default OFF) 
  3204.  
  3205. Delete the copy of the original executable file when LXWARP/LXUNWARP processing 
  3206. is successfully completed. 
  3207.  
  3208. The LXWARP and LXUNWARP applications both keep backup copies of the original 
  3209. file during processing.  If an error occurs the original file is automatically 
  3210. restored.  If the new executable is successfully created use of this option 
  3211. will cause the backup file to be deleted. 
  3212.  
  3213.  
  3214. ΓòÉΓòÉΓòÉ 8.1.2. /bakfile  ΓòÉΓòÉΓòÉ
  3215.  
  3216.  /bakfile
  3217.  
  3218. Syntax: /bakfile:<pathname> (default see below) 
  3219.  
  3220. Specify the name of the backup file in which to keep the unprocessed 
  3221. executable. 
  3222.  
  3223. Both LXWARP and LXWARP always create a copy of the original file before 
  3224. processing.  By default this backup file is created with the same root name and 
  3225. in the same directory as the original file.  By default LXWARP backup files 
  3226. have the extension 'WBK', LXUNWARP backup files have the extension 'UBK'. 
  3227.  
  3228.  
  3229. ΓòÉΓòÉΓòÉ 8.1.3. /threshold  ΓòÉΓòÉΓòÉ
  3230.  
  3231.  /threshold
  3232.  
  3233. Syntax: /threshold:<threshold%> (default 15) 
  3234.  
  3235. Specify the reduction in page size required for compression to be used. 
  3236.  
  3237. Each page in the file is compressed and the reduction in size compared with the 
  3238. original page size.  If the percentage reduction is greater than the value 
  3239. supplied by this parameter the compressed form of the page is used. 
  3240.  
  3241.  
  3242. ΓòÉΓòÉΓòÉ 8.2. LXUnWarp - Remove OS/2 WARP compression from executables  ΓòÉΓòÉΓòÉ
  3243.  
  3244.  LXUnWarp - Remove OS/2 WARP compression from executables
  3245.  
  3246. Usage: LXUNWARP <filename> [/clear] [/bakfile:<backup_pathname>] 
  3247.  
  3248. Example: LXUNWARP myapp.dll 
  3249.  
  3250. LXUNWARP takes an existing executable file and expands OS/2 WARP compressed 
  3251. pages. 
  3252.  
  3253. Although the resulting file will be loadable by OS/2 V2.x the application may 
  3254. still not execute due to OS/2 WARP specific API dependencies. 
  3255.  
  3256. Expanded pages are tested for normal iterated data encoding which is performed 
  3257. as required. 
  3258.  
  3259. LXUNWARP allows OS/2 2.x users to run code linked specifically for OS/2 WARP 
  3260. installations.  It can also be used to undo prior use of the LXWARP command. 
  3261. Use of LXUNWARP on an LXWARPed file may not result in an exact copy of the 
  3262. original file due to page alignment issues and choice of iteration strategy. 
  3263.  
  3264. LXUNWARP is not included in the demonstration version of LXOPT. 
  3265.  
  3266.  
  3267. ΓòÉΓòÉΓòÉ 8.3. Preload - Transfer executables to swapfile  ΓòÉΓòÉΓòÉ
  3268.  
  3269.  Preload - Transfer executables to swapfile
  3270.  
  3271. Usage:    PRELOAD [options] [<exe/dll path>] [options] 
  3272.           /Q             - Quiet mode (suppress copyright notice) 
  3273.           /S             - Silent mode (suppress all output) 
  3274.           /G:<name>      - Group name (default is exe/dll file name) 
  3275.           /I             - Make Preload Manager invisible (remove from task 
  3276.                          list) 
  3277.           /V             - Make Preload Manager visible (add to task list) 
  3278.           /U             - Unload file/group, unload ALL if none specified 
  3279.           /L             - List previous active load instructions 
  3280.           /W:<drvs>      - Wait for drive letters to become available. e.g. 
  3281.                          /W:FGH 
  3282.           /X             - Unload all and terminate the preload manager 
  3283.           /T:<num>       - Exe load time-out in seconds <default 120> 
  3284.           /M:<num>       - Deny request if below <num>Mb free swap space 
  3285.                          (default 10) 
  3286.           /? or /h       - Display options 
  3287.  
  3288.  The preload utility allows users to selectively preload and unload LXOPT 
  3289.  produced EXE/DLL files arranged with the /preload option.  There are important 
  3290.  DLL initialisation, disk space requirements, boot time and user control issues 
  3291.  raised by preloading code, see the Preloading section for more details. 
  3292.  
  3293.  The utility (PRELOAD.EXE) and its accompanying on-line documentation 
  3294.  (PRELOAD.INF) are included with the LXOPT software package and these two files 
  3295.  may also be distributed with LXOPT processed files. 
  3296.  
  3297.  The program operates in three modes, as a command line utility as described 
  3298.  above, in background Wait Mode awaiting network drive availability and as a 
  3299.  continuously active Preload Manager.  The preload utility automatically 
  3300.  activates a manager process if one is not currently running.  All utility 
  3301.  requests are passed on to the manager to be performed. 
  3302.  
  3303.  Preload Manager 
  3304.  The preload manager performs commands supplied via the preload utility. 
  3305.  Started by the first use of the preload utility the manager runs continuously 
  3306.  in the background.  When made visible by the /V option the preload process 
  3307.  appears to the user as a normal windowable VIO application.  If made invisible 
  3308.  via the /I option the process is hidden, removed from the PM task list and 
  3309.  prevented from rejecting an operating system shutdown.  When operating 
  3310.  invisibly the process may only be interacted with via the preload utility. 
  3311.  
  3312.  Termination of the manager will cause all preloaded programs to be unloaded as 
  3313.  the use count of each module drops to zero.  The manager may be terminated by 
  3314.  closing the visible manager session or via the preload utility with the /X 
  3315.  option. 
  3316.  
  3317.  Although the preload manager uses the Presentation Manager API it does not 
  3318.  require PM to be present.  If running with another shell (e.g. TSHELL) 
  3319.  interaction with the task list is not attempted and sessions are started using 
  3320.  parameters compatible with TSHELL operation. 
  3321.  
  3322.  Wait Mode 
  3323.  Permanently invisible, a wait mode process is started to handle a preload 
  3324.  request where the /W parameter is used and the drives specified are not 
  3325.  currently available.  The wait mode process performs the actions normally 
  3326.  performed by the preload utility, it simply waits for the specified drives to 
  3327.  become available before issuing the load request to the preload manager. 
  3328.  
  3329.  Wait Mode is vital for PRELOAD to be able to operate effectively in a customer 
  3330.  network environment.  Users/installation programs are able to insert preload 
  3331.  requests into startup.cmd without concern for network availability. 
  3332.  
  3333.  Preload Utility 
  3334.  The preload utility provides a simple command line interface to the preload 
  3335.  manager.  The utility has options to suppress output (/Q /S), control manager 
  3336.  visibility (/V /I), list current active loads (/L) as well as provide the 
  3337.  basic file loading interface. 
  3338.  
  3339.  DLL files are loaded into the Preload Manager process, each executable is 
  3340.  provided with its own session.  Execution of normal initialisation is 
  3341.  suppressed in LXOPT processed EXE files and per instance initialised DLLs. 
  3342.  This is designed to ensure preloading is both transparent and does not 
  3343.  adversely affect normally loaded versions of the code.  LXOPT processed 
  3344.  globally initialised DLLs and all unprocessed DLLs will initialise normally. 
  3345.  For a fuller discussion of initialisation and the issues raised see Preloading 
  3346.  
  3347.  Files are loaded into named groups.  By default the group name is the filename 
  3348.  derived from the pathname specified on the command line.  For example 
  3349.  
  3350.      PRELOAD C:\APPS\FAST_APP.EXE
  3351.  will preload the LXOPT processed executable file FAST_APP.EXE, LXOPT processed 
  3352.  DLLs on which it depends and load normally any other DLLs which it requires. 
  3353.  These files are treated as a single loadable unit under the group name 
  3354.  FAST_APP.EXE.  Group names become useful when a user wishes to unload all the 
  3355.  preloaded files associated with a single product.  For example 
  3356.  
  3357.      PRELOAD C:\APPS\FAST_APP.EXE /G:FAST_SUITE
  3358.      PRELOAD C:\APPS\FAST_SRV.EXE /G:FAST_SUITE
  3359.      PRELOAD C:\APPS\FAST_WPS.DLL /G:FAST_SUITE
  3360.  preloads the 'FAST' application, background server and workplace shell object 
  3361.  DLL under the single name 'FAST_SUITE'.  To release the preload on all these 
  3362.  files requires one command 
  3363.  
  3364.      PRELOAD /G:FAST_SUITE /U
  3365.   The preloader uses the operating system calls DosStartSession and 
  3366.  DosLoadModule to load files and then transfers them to the swapfile.  This can 
  3367.  be a time consuming process and by default the preloader will wait for up to 
  3368.  120 seconds for a load request to complete.  This time limit may be adjusted 
  3369.  using the /T option. 
  3370.  
  3371.  Preload requests where the amount of free swap space is less than 10Mb will be 
  3372.  rejected.  This limit may be varied by use of the /M option.  /M:0 will 
  3373.  disable free swap space testing but is not recommended, particularly for 
  3374.  preload requests in startup.cmd. 
  3375.  
  3376.  Preload requests may be issued if some or all of the requested files are 
  3377.  already active.  The preload operation is transparent to any existing 
  3378.  executing code.  When complete all instances of preloaded code, including 
  3379.  those previously running, will benefit from the preloading effect. 
  3380.  
  3381.  
  3382. ΓòÉΓòÉΓòÉ 8.4. TimeRun - Measure application run-time  ΓòÉΓòÉΓòÉ
  3383.  
  3384.  TimeRun - Measure application run-time
  3385.  
  3386. Usage:    TIMERUN <application-name> [parameters] 
  3387.  
  3388.  Example: 
  3389.  
  3390.    TIMERUN touch data.txt               Execute touch.exe with the parameter 
  3391.                                         'data.txt' 
  3392.  
  3393.  TIMERUN executes the given application and displays the total execution time 
  3394.  on termination.  This is the total time elapsed from start-up to termination. 
  3395.  This is not a measure of CPU time. 
  3396.  
  3397.  Before executing the application TIMERUN waits 5 seconds to ensure disk 
  3398.  activity due to delayed writes has completed. 
  3399.  
  3400.  Repeating the same command often results in a reduced execution time due to 
  3401.  caching effects.  Subsequent execution times may then vary due to the activity 
  3402.  of background processes.  This can make reliable comparative performance 
  3403.  testing very difficult, see Performance Testing for more details. 
  3404.  
  3405.  TIMERUN uses CMD.EXE to execute the given command.  Total time elapsed may be 
  3406.  dominated by the time taken to invoke the command processor where total run 
  3407.  time is less than 10 seconds. 
  3408.  
  3409.  
  3410. ΓòÉΓòÉΓòÉ 8.5. Thrash - Create high memory load for performance testing  ΓòÉΓòÉΓòÉ
  3411.  
  3412.  Thrash - Create high memory load for performance testing
  3413.  
  3414. Usage:    THRASH <n | n% | nP> 
  3415.  
  3416.  Examples: 
  3417.  
  3418.    THRASH 4              Allocate and continuously access 4Mb of memory. 
  3419.  
  3420.    THRASH 50%            Allocate an amount of memory equivalent to 50% of 
  3421.                          system RAM and continuously access it. 
  3422.  
  3423.    THRASH 75P            Allocate an amount of memory equivalent to 75% of 
  3424.                          system RAM and continuously access it. 
  3425.  
  3426.  THRASH allocates the given amount of memory and continuously accesses it. 
  3427.  Order of access is updated dynamically to maximise the amount of the 
  3428.  allocation retained in system RAM. 
  3429.  
  3430.  THRASH provides a simple way to produce a constant high memory load as might 
  3431.  be generated by several large background applications.  This can be very 
  3432.  useful for testing software performance under low memory conditions. 
  3433.  
  3434.  The alternative of 'P' for the '%' trailing character is provided to simplify 
  3435.  the passing of parameters via a WPS program object. 
  3436.  
  3437.  Use THRASH with caution. Thrashing large quantities of memory may cause your 
  3438.  system to run unacceptably slowly.  Any keyboard input to THRASH will cause it 
  3439.  to release the allocated memory and terminate. 
  3440.  
  3441.  
  3442. ΓòÉΓòÉΓòÉ 8.6. UnLXOPT - Undo processing and delete LXOPTed files  ΓòÉΓòÉΓòÉ
  3443.  
  3444.  UnLXOPT - Undo processing and delete LXOPTed files
  3445.  
  3446. Usage:    UNLXOPT <application-name> 
  3447.  
  3448.  Example: 
  3449.  
  3450.    UNLXOPT MYAPP.DLL                    Restore original MYAPP.DLL and delete 
  3451.                                         LXOPT created files 
  3452.  
  3453.  UNLXOPT is a simple tool that restores the original version of the LXOPTed 
  3454.  file and then deletes any .REC, .PRP, .ORI and automatically generated 
  3455.  recording DLL.  The file names to be deleted are generated by using the 
  3456.  default names that would be used by LXOPT when processing the supplied 
  3457.  application file. 
  3458.  
  3459.  
  3460. ΓòÉΓòÉΓòÉ 9. Technical Support  ΓòÉΓòÉΓòÉ
  3461.  
  3462.                                 Technical Support
  3463.  
  3464.  
  3465. ΓòÉΓòÉΓòÉ 9.1. General  ΓòÉΓòÉΓòÉ
  3466.  
  3467.  General
  3468.  
  3469. Technical support for those evaluating the LXOPT software is available via the 
  3470. following means.  Please use or include the information requested on the 
  3471. Customer Report Form  It is particularly important that you include the 
  3472. software version number. 
  3473.  
  3474. If your question is of a general nature based on results with a specific 
  3475. application please give a brief summary of the type of application and state 
  3476. file size, code size and any relevant numeric performance data. 
  3477.  
  3478. Email     Internet: funcsoft@cix.compulink.co.uk 
  3479.           Compuserve: 100325,3650 
  3480.  
  3481.  Fax      +44 1638 714742 
  3482.  
  3483.  Mail     Functional Software Ltd 
  3484.           The Farmhouse 
  3485.           7 Holywell Farm 
  3486.           Holywell Row 
  3487.           Bury St Edmunds 
  3488.           SUFFOLK IP28 8NL 
  3489.           United Kingdom 
  3490.  
  3491.  
  3492. ΓòÉΓòÉΓòÉ 9.2. Problem Report Form  ΓòÉΓòÉΓòÉ
  3493.  
  3494.  Problem Report Form
  3495.  
  3496.    Product: LXOPT                       Serial No: Demonstrator 
  3497.    Version: 1.2 
  3498.  
  3499.  User Details 
  3500.  
  3501.    Contact Name:                        Address: 
  3502.    Company Name: 
  3503.    Tel: 
  3504.    Fax: 
  3505.    Email:                               ZIP/Postal Code: 
  3506.                                         Country: 
  3507.  
  3508.  Development Environment 
  3509.  
  3510.    Development OS/2 Version(s): 
  3511.    RAM installed: 
  3512.    Available swap space: 
  3513.    Size of EXE/DLL processed: 
  3514.  
  3515.    Development Tools Used (e.g. Compilers, Code Generators, Libraries) 
  3516.    1) 
  3517.    2) 
  3518.    3) 
  3519.    4) 
  3520.    5) 
  3521.  
  3522.  Description 
  3523.  
  3524.  
  3525. ΓòÉΓòÉΓòÉ 9.3. Frequently Asked Questions  ΓòÉΓòÉΓòÉ
  3526.  
  3527.                            Frequently Asked Questions
  3528.  
  3529.  
  3530. ΓòÉΓòÉΓòÉ 9.3.1. Isn't /BASE:65536 better with EXE files?  ΓòÉΓòÉΓòÉ
  3531.  
  3532.  Isn't /BASE:65536 better with EXE files?
  3533.  
  3534. The simple answer is yes.  All EXE files produced by LXOPT are automatically 
  3535. based at address 65536 and the internal fixups removed. 
  3536.  
  3537. LXOPT only requires input EXE files to avoid this option to ensure the file 
  3538. contains all the information required for correct processing.  This has no 
  3539. adverse affect on the resulting LXOPT processed executable. 
  3540.  
  3541.  
  3542. ΓòÉΓòÉΓòÉ 9.3.2. Which is the best arrangement algorithm?  ΓòÉΓòÉΓòÉ
  3543.  
  3544.  Which is the best arrangement algorithm?
  3545.  
  3546. There is no single algorithm that out performs all others for all 
  3547. situations/executables. 
  3548.  
  3549. The binary algorithm introduced with V1.1 is now the default algorithm and is 
  3550. most likely to produce the best overall results. 
  3551.  
  3552. Choice of algorithm is best made by experimentation.  There may not always be a 
  3553. clear winner, sometimes the best algorithm for a 100Kb memory restriction will 
  3554. be beaten by another at 200Kb. 
  3555.  
  3556. Due to the 'Least Recently Used' algorithm used to recycle pages of memory, 
  3557. applications with a short runtime are unlikely to ever be memory restricted 
  3558. unless they require large quantities of system RAM.  Such applications have 
  3559. little need for complex arrangements and may be better suited to the firstuse 
  3560. algorithm.  This algorithm produces the most sequential code which may result 
  3561. in more efficient page loads and cpu caching. 
  3562.  
  3563. The Stat arrangement algorithm may be used on larger applications with long 
  3564. complex runtimes.  Use of Stat is complicated by its /groups option and will 
  3565. often be out performed by the binary algorithm. 
  3566.  
  3567.  
  3568. ΓòÉΓòÉΓòÉ 9.3.3. Where is my recording file?  ΓòÉΓòÉΓòÉ
  3569.  
  3570.  Where is my recording file?
  3571.  
  3572. First be sure you have executed the recording version of the code.  If you 
  3573. invoke your code via a program object it may now reference the .ORI file.  If a 
  3574. previous version is preloaded this old version will still be executed even 
  3575. though a new file exists. 
  3576.  
  3577. Recording files are created by an LXOPT prepared application while it executes. 
  3578. By default this file has the full path name of the executable provided to LXOPT 
  3579. but with a .REC extension. 
  3580.  
  3581. If the executable file name provided via /recfile does not have a full path 
  3582. (e.g. .\MYAPP.REC) then when the recording version of the application executes 
  3583. it will also attempt to create a file without a full path. 
  3584.  
  3585. As no full path is used this file will be created based on the current 
  3586. drive/directory at time of creation.  This can be useful where recording is 
  3587. performed on a separate machine and facilitates simultaneous use of the 
  3588. recording version with different machines on the same network. 
  3589.  
  3590. This can however cause problems where the current drive/directory is not 
  3591. predictable and in these circumstances specify a full pathname for the 
  3592. recording file by use of the /recfile option. 
  3593.  
  3594.  
  3595. ΓòÉΓòÉΓòÉ 9.3.4. LXOPT just hangs during processing!  ΓòÉΓòÉΓòÉ
  3596.  
  3597.  LXOPT just hangs during processing!
  3598.  
  3599. Although LXOPT may appear to be a simple tuning utility it requires a 
  3600. considerable amount of CPU time and memory to process large input files. 
  3601. Preparation/arrangement times of over 5 hours have been reported.  Run times 
  3602. can be particularly long where a large file is processed on a machine with 8Mb 
  3603. or less of RAM. 
  3604.  
  3605. To date there has not been a single reported instance of an LXOPT 'hang' that 
  3606. has not in reality been an exceptionally long run time.  During processing 
  3607. LXOPT is effectively recompiling and relinking your entire application in 
  3608. addition to performing its working set tuning function.  If you suspect LXOPT 
  3609. has hung please allow it to run uninterrupted overnight before reporting the 
  3610. problem. 
  3611.  
  3612.  
  3613. ΓòÉΓòÉΓòÉ 9.3.5. Why isn't my application 50% faster?  ΓòÉΓòÉΓòÉ
  3614.  
  3615.  Why isn't my application 50% faster?
  3616.  
  3617. LXOPT rearranges application code to reduce the total memory occupied by code 
  3618. and the time taken to load it.  The percentages reported by the arrangement 
  3619. process are expected reductions in page faults, not overall run time. 
  3620.  
  3621. It follows that any performance improvement in this area is dictated by how 
  3622. much time the original application spent loading its code.  If your application 
  3623. is a 30Kb executable searching for prime numbers then performance improvements 
  3624. are likely to be restricted to CPU caching benefits.  These CPU caching 
  3625. improvements are unlikely to produce more than a 5% performance boost. 
  3626.  
  3627. Working set tuning, like any efficiency measure, shows its worth when the 
  3628. commodity in question is in short supply.  Examination of an arrangement report 
  3629. shows that page fault reductions improve under increasingly restricted memory 
  3630. conditions.  The improvement is not just in percentage terms, but much more 
  3631. significantly in total number of faults.  The greater the page fault load, the 
  3632. better LXOPT performs. 
  3633.  
  3634.  
  3635. ΓòÉΓòÉΓòÉ 9.3.6. Why does my page fault monitor report more page faults?  ΓòÉΓòÉΓòÉ
  3636.  
  3637.  Why does my page fault monitor report more page faults?
  3638.  
  3639. When LXOPT produces an arrangement report it shows the expected number of page 
  3640. faults loading code from the processed code object.  LXOPT only tunes the code 
  3641. arrangement within this processed object.  LXOPT does not tune data accesses or 
  3642. attempt to simulate page faults generated by any other means. 
  3643.  
  3644. Your application will generate page faults loading application data and 
  3645. executing code in other DLL's such as Presentation Manager API's.  Performance 
  3646. monitoring tools tend to collect and report all such page fault data in 
  3647. combined form. 
  3648.  
  3649. Although the number of page faults reported by such tools will differ from that 
  3650. provided by LXOPT, they can still be used to assess the improvement in an LXOPT 
  3651. processed applications performance.  Use your tool on the original and 
  3652. processed versions of the application and examine the reduction in total page 
  3653. faults.  If your test mimics the actions performed during LXOPT recording this 
  3654. reduction should agree the numeric reduction in page faults predicted by LXOPT. 
  3655.  
  3656. Page fault monitoring tools will not reveal CPU caching or reduced disk seek 
  3657. time benefits. 
  3658.  
  3659.  
  3660. ΓòÉΓòÉΓòÉ 9.3.7. Why does my application make a beeping noise?  ΓòÉΓòÉΓòÉ
  3661.  
  3662.  Why does my application make a beeping noise?
  3663.  
  3664. Applications produced by LXOPT produce an alternating tone when attempting to 
  3665. display an LXOPT message to the user.  If a message does not appear it is 
  3666. likely that the LXOPT installation directory is not on your PATH.  Add the 
  3667. LXOPT directory to the path and retry the application. 
  3668.  
  3669. Tones generated by a recording version of an application are an indication that 
  3670. an error has occurred.  If an error message is not displayed examine the file 
  3671. 'LXREC.ERR' to identify the source of the error.  This is typically a failure 
  3672. writing to the recording file due to an invalid file name or insufficient disk 
  3673. space. 
  3674.  
  3675. Tones created by an arranged EXE/DLL file are due to processed application 
  3676. lifetime expiry or a warning to reboot your machine for valid performance 
  3677. testing.  Applications produced by the demo version may not be used for more 
  3678. than 7 days.  The reboot warning is displayed if the machine has not been 
  3679. rebooted within the last 30 minutes. 
  3680.  
  3681. LXOPT initiated tones or messages are not generated by EXE/DLL files optimised 
  3682. with the standard version of the software.  These files will perform 
  3683. identically to their unoptimised originals and do not require access to any 
  3684. LXOPT support files. 
  3685.  
  3686.  
  3687. ΓòÉΓòÉΓòÉ 9.3.8. My application fails - Cannot find <app-name>@1?  ΓòÉΓòÉΓòÉ
  3688.  
  3689.  My application fails - Cannot find <app-name>@1?
  3690.  
  3691. The system could not execute the recording version of your application because 
  3692. it could not find the file <app-name>@1.DLL.  This DLL was created for your 
  3693. application by LXOPT to aid in the recording process. 
  3694.  
  3695. This file is located in the directory in which the original EXE/DLL file was 
  3696. processed.  Copy the DLL to a directory on your DPATH. 
  3697.  
  3698.  
  3699. ΓòÉΓòÉΓòÉ 10. Pricing and Ordering Information  ΓòÉΓòÉΓòÉ
  3700.  
  3701.                         Pricing and Ordering Information
  3702.  
  3703.  
  3704. ΓòÉΓòÉΓòÉ 10.1. General  ΓòÉΓòÉΓòÉ
  3705.  
  3706.  General
  3707.  
  3708. LXOPT is a software only product consisting of the LXOPT software and 
  3709. accompanying on-line documentation.  Purchasers of LXOPT receive the latest 
  3710. version of the software, priority technical support and subsequent maintenance 
  3711. releases.  All distribution license fees associated with V1.0 have been 
  3712. removed. 
  3713.  
  3714. All registered LXOPT users are upgraded to V1.2 free of charge.  If you are a 
  3715. registered LXOPT user and have not received your upgrade please contact 
  3716. technical support. 
  3717.  
  3718. Pricing and Ordering: United Kingdom 
  3719. Pricing and Ordering: United States 
  3720. Pricing and Ordering: Other Countries 
  3721.  
  3722.  
  3723. ΓòÉΓòÉΓòÉ 10.2. Country Ordering Information  ΓòÉΓòÉΓòÉ
  3724.  
  3725.                           Country Ordering Information
  3726.  
  3727.  
  3728. ΓòÉΓòÉΓòÉ 10.2.1. United Kingdom  ΓòÉΓòÉΓòÉ
  3729.  
  3730.  United Kingdom
  3731.  
  3732. Pricing 
  3733.  
  3734. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3735. ΓöéProduct                            ΓöéPricing (╨¼)         Γöé
  3736. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3737. ΓöéLXOPT V1.2 Single User             Γöé125.00              Γöé
  3738. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3739. ΓöéLXOPT V1.2 Additional User         Γöé65.00               Γöé
  3740. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3741.  
  3742. All prices exclude delivery and local taxes.  Prices are those in effect at 
  3743. time of publication and are subject to change without notice.  Please confirm 
  3744. before ordering. 
  3745.  
  3746. Ordering 
  3747.  
  3748.            OneStop                      Grey Matter
  3749.    OS/2 Software and Support           Prigg Meadow
  3750.          Maggs House                     Ashburton
  3751.        78 Queens Road                  DEVON TQ13 7DF
  3752.           Clifton                     United Kingdom
  3753.        BRISTOL BS8 1QX
  3754.        United Kingdom
  3755.  
  3756.    Tel: +44 (0)117 985 3370       Tel: +44 (0)1364 653499
  3757.    Fax: +44 (0)117 985 3373       Fax: +44 (0)1364 653071
  3758.  
  3759.  
  3760. ΓòÉΓòÉΓòÉ 10.2.2. United States  ΓòÉΓòÉΓòÉ
  3761.  
  3762.  United States
  3763.  
  3764. Pricing 
  3765.  
  3766. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3767. ΓöéProduct                            ΓöéPricing (US$)       Γöé
  3768. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3769. ΓöéLXOPT V1.2 Single User             Γöé195.00              Γöé
  3770. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3771. ΓöéLXOPT V1.2 Additional User         Γöé95.00               Γöé
  3772. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3773.  
  3774. All prices exclude delivery and local taxes.  Prices are those in effect at 
  3775. time of publication and are subject to change without notice.  Please check 
  3776. with supplier before ordering. 
  3777.  
  3778. Ordering 
  3779. LXOPT and additional user licenses are available from BMT Micro.  International 
  3780. callers should dial the code for an international call, followed by '1' (the 
  3781. country code for the U.S.) followed by the numbers shown below. 
  3782.  
  3783.                Mail Orders To: BMT Micro
  3784.                                Banbury Plaza
  3785.                                2515-C S. 17th St.
  3786.                                Wilmington, NC 28401
  3787.                                U.S.A.
  3788. Prepared Form: BMT Micro Mail/Fax Order Form 
  3789.  
  3790.                  Voice Orders: 8:00am - 8:00pm EST (-5 GMT)
  3791.                                (800) 414-4268  (Orders Only, USA and Canada)
  3792.                                (910) 791-7052  (Orders, questions)
  3793.  
  3794.                    Fax Orders: (800) 346-1OS2  (USA and Canada)
  3795.                                (910) 350-2937  24 hours / 7 Days
  3796.  
  3797.       Online Orders via modem: (910) 350-8061  14.4K
  3798.                                (910) 799-0923  28.8K
  3799.  
  3800. BMT Micro maintain a web site at http://www.wilmington.net/bmtmicro/ which 
  3801. contains the latest product and ordering information. 
  3802.  
  3803.   Email ordering and general ordering questions:
  3804.                via Compuserve: BMT Micro, 74031,307
  3805.                  via Internet: bmt@wilmington.net
  3806.  
  3807.                America Online: bmtmicro
  3808.  
  3809.   Technical Support Questions:
  3810.                via Compuserve: 100325,3650
  3811.                  via Internet: funcsoft@cix.compulink.co.uk
  3812.  
  3813. Credit Cards 
  3814. BMT accept Visa, Mastercard, Discover, Eurocard, American Express, Novus (all 
  3815. variations) and Optima. 
  3816.  
  3817. Money Orders/Checks 
  3818. Money Orders, cashiers, personal and company checks should be drawn in U.S. 
  3819. dollars and made payable to BMT Micro.  Personal/Company checks may be drawn in 
  3820. Canadian dollars but must equal the total order value in U.S. funds. 
  3821.  
  3822. Purchase Orders 
  3823. BMT Micro accept purchase orders from educational institutions, governmental 
  3824. agencies and other verifiable businesses.  Terms are "Due Upon Receipt". 
  3825.  
  3826. Special Information for German Customers 
  3827. Payment may be made by depositing payment into the BMT Micro account with 
  3828. Deutshe Bank. 
  3829.  
  3830.    Empfanger: Thomas Bradford / BMT Micro
  3831.    Konto-Nummer: 0860221
  3832.    Bankleitzahl: 500-700-10
  3833.  
  3834.  
  3835. ΓòÉΓòÉΓòÉ <hidden> BMT Micro Mail/Fax Order Form ΓòÉΓòÉΓòÉ
  3836.  
  3837.  
  3838.    BMT Micro
  3839.    Banbury Plaza
  3840.    2515-C S. 17th St.
  3841.    Wilmington, NC 28401
  3842.    U.S.A.
  3843.  
  3844. Customer Details                         Delivery Details (if different)
  3845.  
  3846.   Name _________________________________ _______________________________
  3847.  
  3848.   Company ______________________________ _______________________________
  3849.  
  3850.   Address ______________________________ _______________________________
  3851.  
  3852.           ______________________________ _______________________________
  3853.  
  3854.   ZIP Code _____________________________ _______________________________
  3855.  
  3856.   Phone ________________________________ _______________________________
  3857.  
  3858.   Order Reference _____________________________________________________
  3859.  
  3860. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3861. ΓöéProduct                            ΓöéPrice     ΓöéQuantity ΓöéTotal    Γöé
  3862. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3863. ΓöéLXOPT V1.2                         Γöé$195.00   Γöé         Γöé         Γöé
  3864. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3865. ΓöéAdditional User(s)                 Γöé$95.00    Γöé         Γöé         Γöé
  3866. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3867.  Delivery: (Circle One) 
  3868.  
  3869. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3870. Γöé1st Class (anywhere)      ΓöéFree    Γöé                          Γöé        Γöé
  3871. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3872. ΓöéAirborne (Mainland USA)   Γöé$ 7.00  ΓöéAirborne (Alaska, Hawaii) Γöé$12.00  Γöé
  3873. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3874. ΓöéFedEx (Mainland USA)      Γöé$13.00  ΓöéFedEx (Alaska, Hawaii)    Γöé$18.00  Γöé
  3875. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3876. ΓöéFedEx (Canada, Mexico)    Γöé$25.00  ΓöéFedEx (Europe, Japan)     Γöé$30.00  Γöé
  3877. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3878.  
  3879. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3880. ΓöéSub Total      ΓöéDelivery       ΓöéSales Tax*     ΓöéTotal          Γöé
  3881. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3882. Γöé$              Γöé$              Γöé$              Γöé$              Γöé
  3883. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3884. * Note: Applies to North Carolina residents only. 
  3885.  
  3886. Credit Cards Only 
  3887.  
  3888. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3889. ΓöéCircle One:   Visa / Mastercard / Discover / Eurocard /     Γöé
  3890. ΓöéAmerican Express / Novus / Optima                           Γöé
  3891. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3892. ΓöéCredit card number:                                         Γöé
  3893. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3894. ΓöéExpiration date:                                            Γöé
  3895. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3896. ΓöéAuthorization signature:                                    Γöé
  3897. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3898.  
  3899.  
  3900. ΓòÉΓòÉΓòÉ 10.2.3. Other Countries  ΓòÉΓòÉΓòÉ
  3901.  
  3902.  Other Countries
  3903.  
  3904. To order LXOPT first check with your preferred supplier of development tools 
  3905. within your own country to see if LXOPT has recently become available. 
  3906.  
  3907. If LXOPT is not yet available customers are requested to order from one of the 
  3908. countries below. 
  3909.  
  3910. United Kingdom 
  3911. United States 
  3912.  
  3913.